當前微信接口類已實現以下接口,代碼上如果不夠簡潔的,請自行處理。
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>