首页 > 代码库 > asp.net C# 实现微信接口权限开发类

asp.net C# 实现微信接口权限开发类

当前微信接口类已实现以下接口,代码上如果不够简洁的,请自行处理。
1.获取access_token
2.获取用户基本信息
3.生成带参数二维码
4.新增永久素材
5.新增临时素材
6.发送微信模版
7.网页授权获取用户基本信息
8.分享朋友圈
关于需要使用poststr字符串可以在asp.net 页面进行poststr配置

//获取素材列表
var jsonitem = new
{
type = "image",
offset = 0,
count = 999
};
JavaScriptSerializer js = new JavaScriptSerializer();
string poststr = js.Serialize(jsonitem);

using System;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Threading;using System.Threading.Tasks;using System.Web;namespace DomainModel.Model{    public class WeChatSMS    {     //该类有用到数据库表WeChatAccessTokens保存和Log日志,这两个表可以根据自己喜好自行创建        /// <summary>        /// AppID(应用ID)        /// </summary>        public static string APPID = "APPID";        /// <summary>        /// AppSecret(应用密钥)        /// </summary>        private static string SECRET = "SECRET";        #region 微信模板ID        /// <summary>        /// 兑换码领取成功通知        /// </summary>        public static string Template = "zjXZufqN-9RguRy5T9QQ9N1ueSEkkcbPiRlzWe0XUmI";        /// <summary>        /// 校验码通知        /// </summary>        public static string ConcertTemplate = "tIuE4GJIKO3wAoyt-GawmTi03tdOqlg9CHw0IwcZVsk";        /// <summary>        /// 领取成功通知        /// </summary>        public static string GetTemplate = "mpADikrfOojgF7S-_zhTxgqB7F4hy_6qwAYd8f-g_sU";        #endregion                /// <summary>          /// 获取时间戳          /// </summary>          /// <returns></returns>          public static string GetTimeStamp()        {            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);            return Convert.ToInt64(ts.TotalSeconds).ToString();        }        #region access_token        /// <summary>        /// 获取access_token        /// </summary>        /// <returns></returns>        public static string GetAccess_Token()        {            using (DB db = DBFactory.CreateDB())            {                var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "access_token").ToList();                if (list.Count == 1)                {                    if (list[0].UpdateDate.AddHours(2) > DateTime.Now)                    {                        return list[0].AccessToken;                    }                }            }            return SetAccess_Token();        }        /// <summary>        /// 获取access_token        /// </summary>        private static string TOKENURL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";        /// <summary>        /// 更新access_token        /// </summary>        /// <returns></returns>        public static string SetAccess_Token()        {            string url = string.Format(WeChatSMS.TOKENURL,WeChatSMS.APPID, WeChatSMS.SECRET);            string json = HttpPost(url, "GET", "");            string pattern = "^{\"access_token\":\"(?<access_token>.+?)\"";            Regex regex = new Regex(pattern);            var match = regex.Match(json);            string AccessToken = "";            if (match.Success)            {                AccessToken = match.Result("${access_token}");                using (DB db = DBFactory.CreateDB())                {                    var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "access_token").ToList();                    if (list.Count == 1)                    {                        list[0].AccessToken = AccessToken;                        list[0].UpdateDate = DateTime.Now;                    }                    else                    {                        WeChatAccessToken item = new WeChatAccessToken();                        item.APPID = WeChatSMS.APPID;                        item.ParamName = "access_token";                        item.AccessToken = AccessToken;                        item.UpdateDate = DateTime.Now;                        db.WeChatAccessTokens.InsertOnSubmit(item);                    }                    db.SubmitChanges();                }            }            return AccessToken;        }        #endregion        #region jsapi_ticket        /// <summary>        /// 获取jsapi_ticket        /// </summary>        private static string JSAPI_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi";        /// <summary>        /// 获取jsapi_ticket        /// </summary>        /// <returns></returns>        public static string GetJsapi_Ticket()        {            using (DB db = DBFactory.CreateDB())            {                var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "jsapi_ticket").ToList();                if (list.Count == 1)                {                    if (list[0].UpdateDate.AddHours(2) > DateTime.Now)                    {                        return list[0].AccessToken;                    }                }            }            return SetJsapi_Ticket();        }        /// <summary>        /// 更新jsapi_ticket        /// </summary>        /// <returns></returns>        public static string SetJsapi_Ticket()        {            string JsapiTicket = "";            string json = GetJson(JSAPI_TICKET, "GET", "", "分享微信信息异常记录");            string pattern = "\"ticket\":\"(?<ticket>.+?)\",";            Regex regex = new Regex(pattern);            var match = regex.Match(json);            if (match.Success)            {                JsapiTicket = match.Result("${ticket}");                using (DB db = DBFactory.CreateDB())                {                    var list = db.WeChatAccessTokens.Where(s => s.APPID == WeChatSMS.APPID && s.ParamName == "jsapi_ticket").ToList();                    if (list.Count == 1)                    {                        list[0].AccessToken = JsapiTicket;                        list[0].UpdateDate = DateTime.Now;                    }                    else                    {                        WeChatAccessToken item = new WeChatAccessToken();                        item.APPID = WeChatSMS.APPID;                        item.ParamName = "jsapi_ticket";                        item.AccessToken = JsapiTicket;                        item.UpdateDate = DateTime.Now;                        db.WeChatAccessTokens.InsertOnSubmit(item);                    }                    db.SubmitChanges();                }            }            return JsapiTicket;        }        #endregion        #region 素材管理        public static string uploadTemporaryUrl = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}";        /// <summary>        /// 新增临时素材        /// </summary>        /// <param name="type">上传文件类型</param>        /// <param name="filePath">文件的绝对路径</param>        /// <returns></returns>        public static string UploadTemporaryFile(string type, string filePath)        {           return UploadData(uploadTemporaryUrl, "POST", type, filePath, "新增临时素材");                            }        public static string uploadPerpetualUrl = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}";        /// <summary>        /// 新增永久素材        /// </summary>        /// <param name="type">上传文件类型</param>        /// <param name="filePath">文件的绝对路径</param>        /// <returns></returns>        public static string UploadPerpetualFile(string type, string filePath)        {            return UploadData(uploadPerpetualUrl, "POST", type, filePath, "新增永久素材");                    }                /// <summary>        /// 上传永久通用         /// </summary>        /// <param name="url"></param>        /// <param name="method"></param>        /// <param name="type"></param>        /// <param name="filePath"></param>        /// <param name="category"></param>        /// <returns></returns>        public static string UploadData(string url, string method, string type, string localPath, string category)        {            string resultJson = "";            while (true)            {                string json = UploadVideo.GetUploadVideoResult(url, GetAccess_Token(), type, localPath, "", "");                string pattern = "^{\"errcode\":(?<errcode>.+?),";                Regex regex = new Regex(pattern);                var match = regex.Match(json);                if (match.Success)                {                    string errcode = match.Result("${errcode}");                    if (errcode == "-1")                    {                        //-1系统繁忙,此时请开发者稍候再试\                        break;                    }                    else if (errcode == "42001")                    {                        //42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明                         SetAccess_Token();                    }                    else if (errcode == "40001")                    {                        //40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口                        SetAccess_Token();                    }                    else                    {                        LogControls.InsertLogs(json, category);                        break;                    }                }                else                {                    pattern = "\"media_id\":\"(?<media_id>.+?)\",";                    regex = new Regex(pattern);                    match = regex.Match(json);                    if (match.Success)                    {                        resultJson = json;                        break;                    }                }            }            return resultJson;        }        public static string uploadImageUrl = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={0}";        /// <summary>        /// 新增图文中的图片素材        /// </summary>        /// <param name="url"></param>        /// <param name="filePath"></param>        /// <param name="category"></param>        /// <returns></returns>        public static string UploadImage(string filePath)        {            string resultJson = "";            using (WebClient client = new WebClient())            {                while (true)                {                    byte[] b = client.UploadFile(string.Format(uploadImageUrl, GetAccess_Token()), filePath);//调用接口上传文件                    string json = Encoding.Default.GetString(b);//获取返回值                    string pattern = "^{\"errcode\":(?<errcode>.+?),";                    Regex regex = new Regex(pattern);                    var match = regex.Match(json);                    if (match.Success)                    {                        string errcode = match.Result("${errcode}");                        if (errcode == "-1")                        {                            //-1系统繁忙,此时请开发者稍候再试\                            break;                        }                        else if (errcode == "42001")                        {                            //42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明                             SetAccess_Token();                        }                        else if (errcode == "40001")                        {                            //40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口                            SetAccess_Token();                        }                        else                        {                            LogControls.InsertLogs(json, "新增图文中的图片素材");                            break;                        }                    }                    else                    {                        if (json.Contains("url"))                        {                            resultJson = json.Replace("\\","");                            break;                        }                    }                }            }            return resultJson;          }        /// <summary>        /// 获取素材列表        /// </summary>        public static string BatchgetMaterialUrl = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token={0}";        /// <summary>        /// 获取素材列表        /// </summary>        /// <returns></returns>        public static string GetBatchget_Material(string postDataStr)        {            return GetJson(BatchgetMaterialUrl, "POST", postDataStr, "获取素材列表信息异常");                    }        #endregion        #region 带参数二维码        public const string CreateTicketUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";        /// <summary>        /// 创建二维码ticket        /// </summary>        public static string GetCreateTicket(string postDataStr)        {            return GetJson(CreateTicketUrl, "POST", postDataStr, "创建二维码ticket异常");        }        public const string GetTicketUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={0}";        /// <summary>        /// 通过ticket换取二维码图片路径        /// </summary>        /// <param name="ticket"></param>        /// <returns></returns>        public static string GetTicketImage(string ticket,string path,string filename)        {            try            {                string uriStr = string.Format(GetTicketUrl, ticket.Replace("\\", ""));                HttpWebRequest requestScore = (HttpWebRequest)WebRequest.Create(uriStr);                requestScore.Method = "GET";                requestScore.ContentType = "image/jpg;charset=UTF-8";                HttpWebResponse response = (HttpWebResponse)requestScore.GetResponse();                Stream myResponseStream = response.GetResponseStream();                Image img = Image.FromStream(myResponseStream);                string imagePath = HttpContext.Current.Server.MapPath(path + filename);                string dpath = HttpContext.Current.Server.MapPath(path);                if (!Directory.Exists(dpath))                {                    Directory.CreateDirectory(dpath);                }                img.Save(imagePath);                myResponseStream.Close();                return path + filename;            }            catch (Exception ex)            {                LogControls.InsertLogs(ex.ToString() + "\r\n" + ticket, "微信二维码图片异常");                return "";            }        }        #endregion        #region 发送模板通用        /// <summary>        /// 接口调用请求说明        /// </summary>        private static string TEMPLATESEND = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=";        /// <summary>        /// 微信发送模板信息        /// </summary>        /// <param name="postDataStr"></param>        /// <returns></returns>        public static void SendTemplate(string postDataStr)        {            string Url = TEMPLATESEND + GetAccess_Token();            SendIteration(Url, "POST", postDataStr);                  }        /// <summary>        /// 迭代发送        /// 42001:access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明        /// </summary>        /// <param name="Url"></param>        /// <param name="Method"></param>        /// <param name="postDataStr"></param>        /// <returns></returns>        private static void SendIteration(string Url, string Method, string postDataStr)        {            var json = HttpPost(Url, Method, postDataStr);            string pattern = "^{\"errcode\":(?<errcode>.+?),\"";            Regex regex = new Regex(pattern);            var match = regex.Match(json);            string errcode = "";            if (match.Success)            {                errcode = match.Result("${errcode}");                if (errcode == "42001")                {                    //42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明                    Url = TEMPLATESEND + SetAccess_Token();                    SendIteration(Url, Method, postDataStr);                }                                else if (errcode == "40001")                {                    //40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口                    Url = TEMPLATESEND + SetAccess_Token();                    SendIteration(Url, Method, postDataStr);                }                else if (errcode == "43004")                {                    //43004需要接收者关注                }                else if (errcode != "0")                {                    LogControls.InsertLogs(json, "体彩微信信息异常记录");                }            }        }        #endregion        #region 获取用户基本信息        /// <summary>        /// 获取用户基本资料        /// </summary>        public static string UserinfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=";        /// <summary>        /// 获取用户基本信息        /// </summary>        /// <param name="postDataStr"></param>        public static string GetUserInfo(string OPENID)        {            string Url = UserinfoUrl + GetAccess_Token() + "&openid=" + OPENID + "&lang=zh_CN";            string json = HttpPost(Url, "GET", "");                        Regex rg = new Regex( "^{\"errcode\":(?<errcode>.+?),\"");            Match match = rg.Match(json);            if (match.Success)            {                while (true)                {                    string errcode = match.Result("${errcode}");                    if (errcode == "42001")                    {                        //42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明                         WeChatSMS.SetAccess_Token();                        GetUserInfo(OPENID);                    }                    else if (errcode == "40001")                    {                        //40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口                        WeChatSMS.SetAccess_Token();                        GetUserInfo(OPENID);                    }                    else                    {                        LogControls.InsertLogs(json, "分享获取用户信息异常");                        json = "";                        break;                    }                    LogControls.InsertLogs(json, "分享获取用户信息异常--循环");                }            }            return json;        }        #endregion        #region 网页授权获取用户基本信息        public static string WebAccreditUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect";        /// <summary>        /// 网页授权获取用户基本信息链接(redirect_uri/?code=CODE&state=STATE)        /// </summary>        /// <param name="url">授权后重定向的回调链接地址,请使用urlencode对链接进行处理</param>        /// <param name="scope">应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param>        /// <param name="state">重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节</param>        /// <returns></returns>        public static string GetWebAccreditUrl(string redirect_uri, string scope, string state)        {            return string.Format(WebAccreditUrl, APPID, redirect_uri, scope, state);        }        /// <summary>        /// 通过code换取网页授权access_token        /// </summary>        public static string WebAccess_tokenUrl = " https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code";        /// <summary>        /// 通过code换取网页授权access_token        /// </summary>        /// <param name="code"></param>        /// <returns></returns>        public static string GetWebAccess_token(string code)        {            string url = string.Format(WebAccess_tokenUrl, APPID, SECRET, code);            return GetJsonByCode(url, "GET", "", "通过code换取网页授权access_token异常");        }        /// <summary>        /// 刷新access_token        /// </summary>        public static string WebRefreshTokenUrl = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}";        /// <summary>        /// 刷新access_token,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。        /// </summary>        public static string RefreshToken(string refresh_token)        {            string url = string.Format(WebRefreshTokenUrl, APPID, refresh_token);            return GetJsonByCode(url, "GET", "", "刷新access_token异常");        }        /// <summary>        /// 拉取用户信息(需scope为 snsapi_userinfo)        /// </summary>        public static string WebUserinfo = "https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN";        /// <summary>        /// 拉取用户信息(需scope为 snsapi_userinfo)        /// </summary>        /// <param name="access_token"></param>        /// <returns></returns>        public static string GetWebUserInfo(string access_token)        {            string url = string.Format(WebUserinfo, access_token, APPID);            return GetJsonByCode(url, "GET", "", "拉取用户信息(需scope为 snsapi_userinfo)异常");        }        /// <summary>        /// 检验授权凭证(access_token)是否有效        /// </summary>        public static string WebAccess_TokenIsValidUrl = "https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}";        /// <summary>        /// 检验授权凭证(access_token)是否有效        /// </summary>        /// <param name="access_token"></param>        /// <param name="openID"></param>        /// <returns></returns>        public static string ValidAccess_Token(string access_token, string openID)        {            string url = string.Format(WebAccess_TokenIsValidUrl, access_token, openID);            return GetJsonByCode(url, "GET", "", "检验授权凭证(access_token)是否有效异常");        }        #endregion        /// <summary>        /// 通用接口请求        /// </summary>        /// <param name="Url"></param>        /// <param name="Method">POST或者GET</param>        /// <param name="postDataStr"></param>        /// <returns></returns>        public static string HttpPost(string Url, string Method, string postDataStr)        {            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);            request.Method = Method;            request.ContentType = "application/x-www-form-urlencoded";            if (string.IsNullOrWhiteSpace(postDataStr) == false)            {                byte[] dataArray = Encoding.UTF8.GetBytes(postDataStr);                request.ContentLength = dataArray.Length;                Stream dataStream = request.GetRequestStream();                dataStream.Write(dataArray, 0, dataArray.Length);                dataStream.Close();            }            try            {                HttpWebResponse response = (HttpWebResponse)request.GetResponse();                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);                String res = reader.ReadToEnd();                reader.Close();                return res;            }            catch (Exception e)            {                return e.Message + e.ToString();            }        }        /// <summary>        /// 获取微信返回json语句        /// </summary>        /// <param name="objUrl"></param>        /// <param name="Method"></param>        /// <param name="postDataStr"></param>        /// <param name="category"></param>        /// <returns></returns>        public static string GetJson(string objUrl, string Method, string postDataStr, string category)        {            string resultJson = "";            while (true)            {                string url = string.Format(objUrl, GetAccess_Token());                string json = HttpPost(url, Method, postDataStr);                string pattern = "^{\"errcode\":(?<errcode>.+?),";                Regex regex = new Regex(pattern);                var match = regex.Match(json);                if (match.Success)                {                    string errcode = match.Result("${errcode}");                    if (errcode == "-1")                    {                        //-1系统繁忙,此时请开发者稍候再试\                        break;                    }                    else if (errcode == "42001")                    {                        //42001access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明                         SetAccess_Token();                    }                    else if (errcode == "40001")                    {                        //40001获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口                        SetAccess_Token();                    }                    else if (errcode == "0")                    {                        resultJson = json;                        break;                    }                    else                    {                        LogControls.InsertLogs(json, category);                        break;                    }                }                else                {                    resultJson = json;                    break;                }            }            return resultJson;        }        /// <summary>        /// 获取微信返回json语句        /// </summary>        /// <param name="url"></param>        /// <param name="Method"></param>        /// <param name="postDataStr"></param>        /// <param name="category"></param>        /// <returns></returns>        public static string GetJsonByCode(string url, string Method, string postDataStr, string category)        {            string resultJson = "";            while (true)            {                string json = HttpPost(url, Method, postDataStr);                string pattern = "^{\"errcode\":(?<errcode>.+?),";                Regex regex = new Regex(pattern);                var match = regex.Match(json);                if (match.Success)                {                    string errcode = match.Result("${errcode}");                    if (errcode == "-1")                    {                        //-1系统繁忙,此时请开发者稍候再试\                        break;                    }                    else if (errcode == "0")                    {                        resultJson = json;                        break;                    }                    else if (errcode == "40029")                    {                        //40029不合法的oauth_code  Code无效错误                        resultJson = json;                        break;                    }                    else if (errcode == "40003")                    {                        //40003不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID                        resultJson = json;                        break;                    }                    else                    {                        LogControls.InsertLogs(json, category);                        break;                    }                }                else                {                    resultJson = json;                    break;                }            }            return resultJson;        }    }    /// <summary>    /// 微信文件上传通用类    /// </summary>    public static class UploadVideo    {        /// <summary>          /// 填充表单信息的Stream          /// </summary>          /// <param name="formData"></param>          /// <param name="stream"></param>          public static void FillFormDataStream(this Dictionary<string, string> formData, Stream stream)        {            string dataString = GetQueryString(formData);            var formDataBytes = formData =http://www.mamicode.com/= null ? new byte[0] : Encoding.UTF8.GetBytes(dataString);            stream.Write(formDataBytes, 0, formDataBytes.Length);            stream.Seek(0, SeekOrigin.Begin);//设置指针读取位置          }        public static string GetUploadVideoResult(string urlTemplate, string accessToken, string type, string filePath, string title, string introduction)          {           //"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}"            var url = string.Format(urlTemplate, accessToken, type);              var fileDictionary = new Dictionary<string, string>();              fileDictionary["media"] = filePath;            if (title != "")            {                fileDictionary["description"] = string.Format("{{\"title\":\"{0}\", \"introduction\":\"{1}\"}}", title, introduction);            }              string returnText = string.Empty;              Dictionary<string, string> postDataDictionary = null;              using (MemoryStream ms = new MemoryStream())              {                  postDataDictionary.FillFormDataStream(ms); //填充formData                  returnText = HttpPost(url, null, ms, fileDictionary, null, null, 1200000);              }              return returnText;          }              /// <summary>          /// 组装QueryString的方法          /// 参数之间用&连接,首位没有符号,如:a=1&b=2&c=3          /// </summary>          /// <param name="formData"></param>          /// <returns></returns>          public static string GetQueryString(this Dictionary<string, string> formData)          {              if (formData =http://www.mamicode.com/= null || formData.Count == 0)              {                  return "";              }                StringBuilder sb = new StringBuilder();                var i = 0;              foreach (var kv in formData)              {                  i++;                  sb.AppendFormat("{0}={1}", kv.Key, kv.Value);                  if (i < formData.Count)                  {                      sb.Append("&");                  }              }                return sb.ToString();          }            /// <summary>          /// 根据完整文件路径获取FileStream          /// </summary>          /// <param name="fileName"></param>          /// <returns></returns>          public static FileStream GetFileStream(string fileName)          {              FileStream fileStream = null;              if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName))              {                  fileStream = new FileStream(fileName, FileMode.Open);              }              return fileStream;          }            /// <summary>          /// 使用Post方法获取字符串结果          /// </summary>          /// <param name="url"></param>          /// <param name="cookieContainer"></param>          /// <param name="postStream"></param>          /// <param name="fileDictionary">需要上传的文件,Key:对应要上传的Name,Value:本地文件名</param>          /// <param name="timeOut">超时</param>          /// <returns></returns>          public static string HttpPost(string url, CookieContainer cookieContainer = null, Stream postStream = null, Dictionary<string, string> fileDictionary = null, string refererUrl = null, Encoding encoding = null, int timeOut = 1200000)          {              HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);              request.Method = "POST";              request.Timeout = timeOut;               #region 处理Form表单文件上传              var formUploadFile = fileDictionary != null && fileDictionary.Count > 0;//是否用Form上传文件              if (formUploadFile)              {                  //通过表单上传文件                  postStream = postStream ?? new MemoryStream();                    string boundary = "----" + DateTime.Now.Ticks.ToString("x");                  //byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");                  string fileFormdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";                  string dataFormdataTemplate = "\r\n--" + boundary +                                                "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";                  foreach (var file in fileDictionary)                  {                      try                      {                          var fileName = file.Value;                            //准备文件流                          using (var fileStream = GetFileStream(fileName))                          {                              string formdata = http://www.mamicode.com/null;                              if (fileStream != null)                              {                                  //存在文件                                  formdata = http://www.mamicode.com/string.Format(fileFormdataTemplate, file.Key, /*fileName*/ Path.GetFileName(fileName));                              }                              else                              {                                  //不存在文件或只是注释                                  formdata = http://www.mamicode.com/string.Format(dataFormdataTemplate, file.Key, file.Value);                              }                                //统一处理                              var formdataBytes = Encoding.UTF8.GetBytes(postStream.Length == 0 ? formdata.Substring(2, formdata.Length - 2) : formdata);//第一行不需要换行                              postStream.Write(formdataBytes, 0, formdataBytes.Length);                                //写入文件                              if (fileStream != null)                              {                                  byte[] buffer = new byte[1024];                                  int bytesRead = 0;                                  while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)                                  {                                      postStream.Write(buffer, 0, bytesRead);                                  }                              }                          }                      }                      catch (Exception ex)                      {                          throw ex;                      }                  }                  //结尾                  var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");                  postStream.Write(footer, 0, footer.Length);                    request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);              }              else              {                  request.ContentType = "application/x-www-form-urlencoded";              }              #endregion                request.ContentLength = postStream != null ? postStream.Length : 0;              request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";              request.KeepAlive = true;                if (!string.IsNullOrEmpty(refererUrl))              {                  request.Referer = refererUrl;              }              request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";                if (cookieContainer != null)              {                  request.CookieContainer = cookieContainer;              }               #region 输入二进制流              if (postStream != null)              {                  postStream.Position = 0;                    //直接写入流                  Stream requestStream = request.GetRequestStream();                    byte[] buffer = new byte[1024];                  int bytesRead = 0;                  while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)                  {                      requestStream.Write(buffer, 0, bytesRead);                  }                    //debug                  postStream.Seek(0, SeekOrigin.Begin);                  StreamReader sr = new StreamReader(postStream);                  var postStr = sr.ReadToEnd();                  postStream.Close();//关闭文件访问              }              #endregion                HttpWebResponse response = (HttpWebResponse)request.GetResponse();                if (cookieContainer != null)              {                  response.Cookies = cookieContainer.GetCookies(response.ResponseUri);              }                using (Stream responseStream = response.GetResponseStream())              {                  using (StreamReader myStreamReader = new StreamReader(responseStream, encoding ?? Encoding.GetEncoding("utf-8")))                  {                      string retString = myStreamReader.ReadToEnd();                      return retString;                  }              }          }     }}

 

分享朋友圈用到了一般应用程序 public class wxconfig    {        public string appId { get; set; }        public string timestamp { get; set; }        public string nonceStr { get; set; }        public string jsapiticke { get; set; }        public string url { get; set; }        public string signature        {            get            {                string temp = Cryptography.SHA1_Hash("jsapi_ticket=" + jsapiticke + "&noncestr="                    + nonceStr + "&timestamp=" + timestamp + "&url=" + url).ToLower();                return temp;        } }    }    /// <summary>    /// Getjsapi 的摘要说明    /// </summary>    public class Getjsapi : IHttpHandler    {        public void ProcessRequest(HttpContext context)        {            context.Response.ContentType = "text/plain";            wxconfig item = new wxconfig();            item.jsapiticke = WeChatSMS.GetJsapi_Ticket();            item.url = context.Request.Params["urlparam"];            item.appId = WeChatSMS.APPID;            item.timestamp = WeChatSMS.GetTimeStamp();            item.nonceStr = ("GGVi4C3VM0P37wVU");            JavaScriptSerializer js = new JavaScriptSerializer();            string json = js.Serialize(item);            context.Response.Write(json);        }        public bool IsReusable        {            get            {                return false;            }        }    }页面配置代码  <script>        $.ajax({            type: "POST",            url: "/ashx/Getjsapi.ashx",            data: { urlparam: "http://www.chaoyundong.com/mobile/share/sharetest.aspx" },            cache: false,            async: false, //是否ajax同步            success: function (data) {               var item = JSON.parse(data);                //console.log(item);                wx.config({                    debug: false,                    appId: item.appId,                    timestamp: item.timestamp,                    nonceStr: item.nonceStr,                    signature: item.signature,                    jsApiList: [                        checkJsApi,                        onMenuShareTimeline,                        onMenuShareAppMessage                    ]                });                wx.ready(function () {                    //分享到朋友圈                    wx.onMenuShareTimeline({                        title: 测试哈哈哈, // 分享标题                        link: http://movie.douban.com/subject/25785114/, // 分享链接                        imgUrl: http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg, // 分享图标                        success: function (res) {                            //console.log(res);                            alert(112234);                        },                        cancel: function () {                            alert(3333333);                            // 用户取消分享后执行的回调函数                        }                    });                    //分享到朋友                    wx.onMenuShareAppMessage({                        title: 测试哈哈哈, // 分享标题                        link: http://movie.douban.com/subject/25785114/, // 分享链接                        imgUrl: http://demo.open.weixin.qq.com/jssdk/images/p2166127561.jpg, // 分享图标                        success: function (res) {                            //console.log(res);                            alert(112234);                        },                        cancel: function () {                            alert(3333333);                            // 用户取消分享后执行的回调函数                        }                    });                });                            }        });            </script>

 

asp.net C# 实现微信接口权限开发类