微信分享調用JS -- c#篇
1.前端
1.1 導入微信端的JS
如果你的網址是http,則地址為 http://res.wx.qq.com/open/js/jweixin-1.0.0.js
如果你的網址是https,則地址為 https://res.wx.qq.com/open/js/jweixin-1.0.0.js
1.2 調用后台,獲取需要的配置
調用后台,需要的配置為:appId、timestamp、nonceStr、signature
appId為公眾號的appId,timestamp為后台返回的時間戳,nonceStr為后台生成的隨機字符串,signature為后台生成的簽名。
1.3 調用完后台后,加載微信分享配置
1 wx.config({ 2 debug:false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。 3 appId: appId, // 必填,公眾號的唯一標識 4 timestamp: timestamp, // 必填,生成簽名的時間戳 5 nonceStr: nonceStr, // 必填,生成簽名的隨機串 6 signature: signature,// 必填,簽名,見附錄1 7 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表,這里調用的是分享到朋友圈和分享給朋友 8 });
1.4 再檢測JS接口列表
wx.checkJsApi({ jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'], // 需要檢測的JS接口列表 success: function(res) { // 以鍵值對的形式返回,可用的api值true,不可用為false // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"} } });
1.5 wx read,分享配置
在上面1.3步驟完成后,config信息驗證后會執行ready方法,所有接口調用都必須在config接口獲得結果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,則可以直接調用,不需要放在ready函數中。
ready函數中包含寫一些分享配置信息。如分享到朋友圈、分享給朋友的配置信息。
1 wx.ready(function(){ 2 //分享到朋友圈 3 wx.onMenuShareTimeline({ 4 title:'分享標題', // 分享標題 5 link: 'http://'+location.host+'/GFMain/GetIntoFundStartWithShare?pid='+GetQueryString('pid')||'', // 分享鏈接 6 imgUrl: 'http://'+location.host+'/img/share.png', // 分享圖標 7 success: function () { 8 // 用戶確認分享后執行的回調函數 9 }, 10 cancel: function () { 11 // 用戶取消分享后執行的回調函數 12 } 13 }); 14 15 //分享給朋友 16 wx.onMenuShareAppMessage({ 17 title:'分享標題', // 分享標題 18 desc: '分享描述', // 分享描述 19 link: 'http://'+location.host+'/xxx/', // 分享鏈接 20 imgUrl: 'http://'+location.host+'/img/share.png', // 分享圖標 21 type: 'link', // 分享類型,music、video或link,不填默認為link 22 dataUrl: '', // 如果type是music或video,則要提供數據鏈接,默認為空 23 success: function () { 24 // 用戶確認分享后執行的回調函數 25 }, 26 cancel: function () { 27 // 用戶取消分享后執行的回調函數 28 } 29 }); 30 });
1.6 錯誤回調
config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這里更新簽名。
1 //config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這里更新簽名。 2 wx.error(function(res){ 3 });
2.后端
2.1 前端調用后端
在上面的1.2中,前端開始調用后端,后端獲取前端的參數為:前端當前的整個url,包括參數(包括參數)。例如:http://www.cjt.com/alunchen?pid=xxx&home=1
這里需要注意的是參數名字全部最好是小寫,大寫會自定義分享不了。
2.2 獲取ticket
首先要獲取ticket,因為ticket主要是我們從微信獲取的,其他返回給前端的參數都是我們從ticket之上在做一些數據處理。所以,ticket是所有返回數據的根本。
通過訪問微信的API獲取token,獲取ticket之前要首先獲取token,因為ticket獲取要傳一個token給微信。
// 獲取Token public static string GetToken(string appid, string secret) { Log.Info("進入GetToken"); string strJson = RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret)); Log.Info(string.Format("strJson:{0}", strJson)); return CPublicMethod.GetJsonValue(strJson, "access_token"); } //公共方法,request網絡獲取 public static string RequestUrl(string url, string method) { // 設置參數 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.Method = method; request.ContentType = "text/html"; request.Headers.Add("charset", "utf-8"); //發送請求並獲取相應回應數據 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標網頁發送Post請求 Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); return content; } //公共方法,獲取Json public string GetJsonValue(string jsonStr, string key) { string result = string.Empty; if (!string.IsNullOrEmpty(jsonStr)) { key = "\"" + key.Trim('"') + "\""; int index = jsonStr.IndexOf(key) + key.Length + 1; if (index > key.Length + 1) { //先截逗號,若是最后一個,截“}”號,取最小值 int end = jsonStr.IndexOf(',', index); if (end == -1) { end = jsonStr.IndexOf('}', index); } result = jsonStr.Substring(index, end - index); result = result.Trim(new char[] { '"', ' ', '\'' }); //過濾引號或空格 } } return result; }
通過上面的返回的token獲取ticket
1 //獲取ticket 2 public string getJsApiTicket(string appid, string appSecret) 3 { 4 5 //這里開始從微信API獲取ticket 6 string token = GetToken(appid, appSecret); 7 string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + token + ""; 8 Jsapi api = JsonConvert.DeserializeObject<Jsapi>(httpGet(url)); 9 string ticket = api.ticket; 10 return ticket; 11 } 12 13 //公共方法,發起一個http請球,返回值 14 private string httpGet(string url) 15 { 16 try 17 { 18 WebClient MyWebClient = new WebClient(); 19 MyWebClient.Credentials = CredentialCache.DefaultCredentials;//獲取或設置用於向Internet資源的請求進行身份驗證的網絡憑據 20 Byte[] pageData = MyWebClient.DownloadData(url); //從指定網站下載數據 21 string pageHtml = System.Text.Encoding.Default.GetString(pageData); //如果獲取網站頁面采用的是GB2312,則使用這句 22 23 return pageHtml; 24 } 25 26 27 catch (WebException webEx) 28 { 29 Console.WriteLine(webEx.Message.ToString()); 30 return null; 31 } 32 }
備注:這里需要注意的是,由於獲取ticket的失效時間為7200秒(目前來說),所以我們每次獲取到的ticket都要保持在數據庫,等到ticket超過7200秒時再獲取一次。我們這里設計的數據庫有兩個字段:ticket、ticket_expires。ticket為ticket字符串值,ticket_expires為失效時間。
2.3 返回時間戳、隨機字符串、簽名、appid
string jsapiTicket = getJsApiTicket(appid, appSecret); // 返回時間戳 string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now)); // 返回創建隨機字符串 string nonceStr = createNonceStr(); // 返回簽名signature string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + pathurl + ""; string signature = SHA1_Hash(rawstring); // 返回的appid string appid = "xxx"; //創建隨機字符串 public string createNonceStr() { int length = 16; string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; string str = ""; Random rad = new Random(); for (int i = 0; i < length; i++) { str += chars.Substring(rad.Next(0, chars.Length - 1), 1); } return str; } public string SHA1_Hash(string str_sha1_in) { SHA1 sha1 = new SHA1CryptoServiceProvider(); byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in); byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in); string str_sha1_out = BitConverter.ToString(bytes_sha1_out); str_sha1_out = str_sha1_out.Replace("-", "").ToLower(); return str_sha1_out; }
詳細請看微信官方說明:
http://qydev.weixin.qq.com/wiki/index.php?title=WeixinJS%E6%8E%A5%E5%8F%A3
可以關注本人的公眾號,多年經驗的原創文章共享給大家。