這篇文章主要介紹微信開發(fā)-ACCESS TOKEN過期失效怎么辦,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),銅鼓企業(yè)網(wǎng)站建設(shè),銅鼓品牌網(wǎng)站建設(shè),網(wǎng)站定制,銅鼓網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,銅鼓網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
微信開發(fā)-ACCESS TOKEN 過期失效解決方案
起因:因為access_token的重要性,開發(fā)過微信的都知道,但是他有自己的生命周期,官方解釋為:"有效期為7200秒",一天調(diào)用2000次。流量一高,就over了,沒辦法,龍哥不幫我們解決問題,我們就要自己解決,不能等死。
解決思路很簡單:建立公共access token數(shù)據(jù),有效期內(nèi)不重新創(chuàng)建access_token。
解決方案:
1、微信類庫:有效期內(nèi)直接讀取access token數(shù)據(jù)文件中的json數(shù)據(jù),過期失效,重新獲取并創(chuàng)建新的access token數(shù)據(jù)文件
2、數(shù)據(jù)文件:存放有效的access token數(shù)據(jù),具體有:access_token.json和jsapi_ticket.json
核心代碼如下:
Index: wxjsSDK.cs =================================================================== --- wxjsSDK.cs (revision 0) +++ wxjsSDK.cs (revision 1) @@ -0,0 +1,209 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.IO; +using System.Security.Cryptography; +using System.Runtime.Serialization.Json; +using System.Runtime.Serialization; +using System.Net; +using System.Runtime.Serialization.Formatters.Binary; +using System.Text; + +namespace JR.Common +{ + public class wxjsSDK + { + private string appId; + private string appSecret; + + + public wxjsSDK(string appId, string appSecret) + { + this.appId = appId; + this.appSecret = appSecret; + } + + + + //得到數(shù)據(jù)包,返回使用頁面 + public System.Collections.Hashtable getSignPackage() + { + string jsapiTicket = getJsApiTicket(); + string url = HttpContext.Current.Request.Url.ToString(); //"http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; + string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now)); + string nonceStr = createNonceStr(); + // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序 + string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url + ""; + string signature = SHA1_Hash(rawstring); + var signPackage = new System.Collections.Hashtable(); + signPackage.Add("appId", appId); + signPackage.Add("nonceStr", nonceStr); + signPackage.Add("timestamp", timestamp); + signPackage.Add("url", url); + signPackage.Add("signature", signature); + signPackage.Add("rawString", rawstring); + return signPackage; + } + + + //創(chuàng)建隨機字符串 + private string createNonceStr() + { + int length = 16; + string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + string str = ""; + var rad = new Random(); + for (int i = 0; i < length; i++) + { + str += chars.Substring(rad.Next(0, chars.Length - 1), 1); + } + return str; + } + + + //得到ticket 如果文件里時間 超時則重新獲取 + private string getJsApiTicket() + { + string ticket = ""; + // jsapi_ticket 應(yīng)該全局存儲與更新,以下代碼以寫入到文件中做示例 + string path = HttpContext.Current.Server.MapPath(@"/log/jssdk/jsapi_ticket.json"); + if (!File.Exists(path)) + { + File.Create(path).Close(); + } + StreamReader sr = new StreamReader(path, System.Text.Encoding.Default); + string filecontent = sr.ReadToEnd(); + CommonJsonModel jsonModel = null; + if (!string.IsNullOrEmpty(filecontent)) + { + jsonModel = new CommonJsonModel(filecontent); + } + sr.Close(); + sr.Dispose(); + if (jsonModel == null || int.Parse(jsonModel.GetValue("expires_in")) < ConvertDateTimeInt(DateTime.Now)) + { + string accessToken = getAccessToken(); + string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken; + jsonModel = new CommonJsonModel(httpGet(url)); + ticket = jsonModel.GetValue("ticket"); + if (ticket != "") + { + string json = "{\"ticket\":\"" + ticket + "\",\"expires_in\":" + (ConvertDateTimeInt(DateTime.Now) + 7000) + "}"; + StreamWriterMetod(json, path); + } + } + else + { + ticket = jsonModel.GetValue("ticket"); + } + return ticket; + } + + + //得到accesstoken 如果文件里時間 超時則重新獲取 + private string getAccessToken() + { + // access_token 應(yīng)該全局存儲與更新,以下代碼以寫入到文件中做示例 + string access_token = ""; + string path = HttpContext.Current.Server.MapPath(@"/log/jssdk/access_token.json"); + if (!File.Exists(path)) + { + File.Create(path).Close(); + } + StreamReader sr = new StreamReader(path, System.Text.Encoding.Default); + string filecontent = sr.ReadToEnd(); + CommonJsonModel jsonModel = null; + if (!string.IsNullOrEmpty(filecontent)) + { + jsonModel = new CommonJsonModel(filecontent); + } + sr.Close(); + sr.Dispose(); + if (jsonModel == null || int.Parse(jsonModel.GetValue("expires_in")) < ConvertDateTimeInt(DateTime.Now)) + { + string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + + "&secret=" + appSecret + ""; + jsonModel = new CommonJsonModel(httpGet(url)); + access_token = jsonModel.GetValue("access_token"); + if (access_token != "") + { + string json = "{\"access_token\":\"" + access_token + "\",\"expires_in\":" + (ConvertDateTimeInt(DateTime.Now) + 7000) + "}"; + StreamWriterMetod(json, path); + } + } + else + { + access_token = jsonModel.GetValue("access_token"); + } + return access_token; + } + + + //發(fā)起一個http請球,返回值 + private string httpGet(string url) + { + try + { + var MyWebClient = new WebClient(); + MyWebClient.Credentials = CredentialCache.DefaultCredentials; //獲取或設(shè)置用于向Internet資源的請求進行身份驗證的網(wǎng)絡(luò)憑據(jù) + Byte[] pageData = MyWebClient.DownloadData(url); //從指定網(wǎng)站下載數(shù)據(jù) + string pageHtml = System.Text.Encoding.Default.GetString(pageData);//如果獲取網(wǎng)站頁面采用的是GB2312,則使用這句 + //string pageHtml = Encoding.UTF8.GetString(pageData); //如果獲取網(wǎng)站頁面采用的是UTF-8,則使用這句 + return pageHtml; + } + catch (WebException webEx) + { + Console.WriteLine(webEx.Message.ToString()); + return null; + } + } + + + //SHA1哈希加密算法 + private 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; + } + + + /// <summary> + /// StreamWriter寫入文件方法 + /// </summary> + private void StreamWriterMetod(string str, string patch) + { + FileStream stream = new FileStream(patch, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite); + StreamWriter writer = new StreamWriter(stream); + writer.WriteLine(str); + stream.Flush(); + writer.Close(); + stream.Close(); + stream.Dispose(); + writer.Dispose(); + } + + + + + /// <summary> + /// 將c# DateTime時間格式轉(zhuǎn)換為Unix時間戳格式 + /// </summary> + /// <param name="time">時間</param> + /// <returns>double</returns> + private int ConvertDateTimeInt(System.DateTime time) + { + int intResult = 0; + System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); + intResult = Convert.ToInt32((time - startTime).TotalSeconds); + return intResult; + } + + + } + + +} access_token.json {"access_token":"4H14BVCUrAxxxxxxxxxxxxWeLu-zKETaBYqsoKFjsHZDc3xOwc-m43WDw2HjzxEkng2nC7iJuHydNt5PqRDY7HCoAU4lmuaPoYsIQHdW9kA","expire_time":1428599121} access_token.json {"jsapi_ticket":"bxLdikRXVbTPdHSM05e5u1wgoccccccccccccccccccccccccccccc11FFzYsiqbXZN0SDGN6Dnksnt2Q","expire_time":1428599122}
以上是“微信開發(fā)-ACCESS TOKEN過期失效怎么辦”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:微信開發(fā)-ACCESSTOKEN過期失效怎么辦
網(wǎng)頁地址:http://chinadenli.net/article44/ppgshe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司、、軟件開發(fā)、企業(yè)建站、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)