asp.net C# 实现微信接口权限开发类
Posted caiyitao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 == 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 == 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 = null; if (fileStream != null) { //存在文件 formdata = string.Format(fileFormdataTemplate, file.Key, /*fileName*/ Path.GetFileName(fileName)); } else { //不存在文件或只是注释 formdata = 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 + "×tamp=" + 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# 实现微信接口权限开发类的主要内容,如果未能解决你的问题,请参考以下文章