Asp.Net頁面自定義微信分享
阿新 • • 發佈:2018-12-01
參考微信JS-SDK說明文件,
1、先登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。
2、在需要呼叫JS介面的頁面引入如下JS檔案,(支援https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js
要分享的頁面程式碼:
using System.Runtime.Serialization.Json;//需新增System.Runtime.Serialization引用 public partial class WeiXinShareScript : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { RegisterWeiXinShareScript(); } } private void RegisterWeiXinShareScript() { //公眾號的應用ID string appid = ""; //公眾號的應用金鑰 string secret = ""; //生成簽名的時間戳 TimeSpan ts = DateTime.Now - DateTime.Parse("1970-01-01 00:00:00"); string timestamp = ts.TotalSeconds.ToString().Split('.')[0]; //生成簽名的隨機串 string nonceStr = "test"; //微信access_token,用於獲取微信jsapi_ticket string token = GetAccess_token(appid, secret); //微信jsapi_ticket string ticket = GetTicket(token); //當前網頁的URL string pageurl = Request.Url.AbsoluteUri; //對所有待簽名引數按照欄位名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字串 string str = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + pageurl; //簽名,使用SHA1生成 string signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "SHA1").ToLower(); //要註冊到頁面的JS指令碼 StringBuilder sbjsApi = new StringBuilder(); sbjsApi.Append("<script>"); //通過config介面注入許可權驗證配置 sbjsApi.Append("wx.config({debug:false,"); sbjsApi.Append("appId: '" + appid + "',"); sbjsApi.Append("timestamp: " + timestamp + ","); sbjsApi.Append("nonceStr: '" + nonceStr + "',"); sbjsApi.Append("signature: '" + signature + "',"); sbjsApi.Append("jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'chooseImage', 'uploadImage', 'getNetworkType']});"); //通過ready介面處理成功驗證 sbjsApi.Append("wx.ready(on_weixin_ready);"); sbjsApi.Append("function on_weixin_ready() {weixin_share();}"); //獲取“分享給朋友”按鈕點選狀態及自定義分享內容介面 sbjsApi.Append("function weixin_share(){"); sbjsApi.Append("wx.onMenuShareAppMessage({"); sbjsApi.Append("title:'分享出去的標題',"); sbjsApi.Append("desc:'分享出去的內容',"); sbjsApi.Append("link:'分享出去的連結地址',"); sbjsApi.Append("imgUrl:'分享出去的圖示地址',"); sbjsApi.Append("type:'link',"); sbjsApi.Append("dataUrl:'',"); sbjsApi.Append("success: function () { alert('分享成功');},"); sbjsApi.Append("cancel:function () {}"); sbjsApi.Append("});"); //獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面 sbjsApi.Append("wx.onMenuShareTimeline({"); sbjsApi.Append("title:'分享出去的標題',"); sbjsApi.Append("link:'分享出去的連結地址',"); sbjsApi.Append("imgUrl:'分享出去的圖示地址',"); sbjsApi.Append("success: function () { alert('分享成功');},"); sbjsApi.Append("cancel:function () {}"); sbjsApi.Append("});}"); sbjsApi.Append("</script>"); Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "weixin", sbjsApi.ToString().Trim()); } /// <summary> /// 獲取微信jsapi_ticket /// </summary> /// <param name="token">access_token</param> /// <returns>jsapi_ticket</returns> public string GetTicket(string token) { string ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi"; string jsonresult = HttpGet(ticketUrl, "UTF-8"); WX_Ticket wxTicket = JsonDeserialize<WX_Ticket>(jsonresult); return wxTicket.ticket; } /// <summary> /// 獲取微信access_token /// </summary> /// <param name="appid">公眾號的應用ID</param> /// <param name="secret">公眾號的應用金鑰</param> /// <returns>access_token</returns> private string GetAccess_token(string appid, string secret) { string tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret; string jsonresult = HttpGet(tokenUrl, "UTF-8"); WX_Token wx = JsonDeserialize<WX_Token>(jsonresult); return wx.access_token; } /// <summary> /// JSON反序列化 /// </summary> /// <typeparam name="T">實體類</typeparam> /// <param name="jsonString">JSON</param> /// <returns>實體類</returns> private T JsonDeserialize<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T obj = (T)ser.ReadObject(ms); return obj; } /// <summary> /// HttpGET請求 /// </summary> /// <param name="url">請求地址</param> /// <param name="encode">編碼方式:GB2312/UTF-8</param> /// <returns>字串</returns> private string HttpGet(string url, string encode) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "text/html;charset=" + encode; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding(encode)); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } } /// <summary> /// 通過微信API獲取access_token得到的JSON反序列化後的實體 /// </summary> public class WX_Token { public string access_token { get; set; } public string expires_in { get; set; } } /// <summary> /// 通過微信API獲取jsapi_ticket得到的JSON反序列化後的實體 /// </summary> public class WX_Ticket { public string errcode { get; set; } public string errmsg { get; set; } public string ticket { get; set; } public string expires_in { get; set; } }