微信開發-ACCESS TOKEN 過期失效解決方案
微信開發-ACCESS TOKEN 過期失效解決方案
起因:因為access_token的重要性,開發過微信的都知道,但是他有自己的生命週期,官方解釋為:"有效期為7200秒",一天調用2000次。流量一高,就over了,沒辦法,龍哥不幫我們解決問題,就要自己解決,不能等死。
解決思路很簡單:建立公共access token數據,有效期內不重新創建access_token。
解決方案:
1、微信類庫:有效期內直接讀取access token數據文件中的json數據,過期失效,重新獲取並創建新的access token數據文件
2、數據文件:存放有效的access token數據,具體有: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; + } + + + + //得到数据包,返回使用页面 + 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(); + // 这里参数的顺序要按照 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; + } + + + //创建随机字符串 + 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 应该全局存储与更新,以下代码以写入到文件中做示例 + 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 应该全局存储与更新,以下代码以写入到文件中做示例 + 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; + } + + + //发起一个http请球,返回值 + private string httpGet(string url) + { + try + { + var MyWebClient = new WebClient(); + MyWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置用于向Internet资源的请求进行身份验证的网络凭据 + Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据 + string pageHtml = System.Text.Encoding.Default.GetString(pageData);//如果获取网站页面采用的是GB2312,则使用这句 + //string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是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时间格式转换为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}
更多微信開發-ACCESS TOKEN 過期解決方案 相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種開源的腳本語言,廣泛應用於網頁開發和伺服器端編程,尤其在微信開發中得到了廣泛的應用。如今,越來越多的企業和開發者開始使用PHP進行微信開發,因為它成為了真正的易學易用的開發語言。在微信開發中,訊息的加密和解密是一個非常重要的問題,因為它們涉及資料的安全性。對於沒有加密和解密方式的消息,駭客可以輕鬆取得其中的數據,對用戶造成威脅

隨著微信的普及,越來越多的企業開始將其作為行銷工具。而微信群發功能,則是企業進行微信行銷的重要手段之一。但是,如果只依靠手動發送,對於行銷人員來說是一件極為費時費力的工作。所以,開發一款微信群發工具就顯得格外重要。本文將介紹如何使用PHP開發微信群發工具。一、準備工作開發微信群發工具,我們需要掌握以下幾個技術點:PHP基礎知識微信公眾平台開發開發工具:Sub

在微信公眾號開發中,使用者標籤管理是一個非常重要的功能,可以讓開發者更了解和管理自己的使用者。本篇文章將介紹如何使用PHP實作微信使用者標籤管理功能。一、取得微信用戶openid在使用微信用戶標籤管理功能之前,我們首先需要取得用戶的openid。在微信公眾號開發中,透過使用者授權的方式取得openid是比較常見的做法。在使用者授權完成後,我們可以透過以下程式碼取得用

如何使用PHP實現微信公眾號開發微信公眾號已經成為了許多企業推廣和互動的重要管道,而PHP作為常用的Web語言,也可以用來進行微信公眾號的開發。本文將介紹使用PHP實現微信公眾號開發的具體步驟。第一步:取得微信公眾號的開發者帳號在開始微信公眾號開發之前,需要先去申請一個微信公眾號的開發者帳號。具體的註冊流程可參考微信公眾平台的官方網

隨著微信成為了人們生活中越來越重要的通訊工具,其敏捷的訊息傳遞功能迅速受到廣大企業和個人的青睞。對企業而言,將微信發展為一個行銷平台已經成為趨勢,而微信開發的重要性也逐漸凸顯。在其中,群發功能更是被廣泛使用,那麼,作為PHP程式設計師,如何實現群發訊息發送記錄呢?以下將為大家簡單介紹一下。 1.了解微信公眾號相關開發知識在了解如何實現群發訊息發送記錄之前,我

在微信公眾號開發中,投票功能經常被運用。投票功能是讓使用者快速參與互動的好方式,也是舉辦活動和調查意見的重要工具。本文將為您介紹如何使用PHP實作微信投票功能。在取得微信公眾號授權首先,你需要取得微信公眾號的授權。在微信公眾平台上,你需要設定微信公眾號碼的api地址、官方帳號和公眾號碼對應的token。在我們使用PHP語言開發的過程中,我們需要使用微信官方提供的PH

微信是目前全球用戶規模最大的社群平台之一,隨著行動網路的普及,越來越多的企業開始意識到微信行銷的重要性。在進行微信行銷時,客服服務是至關重要的一環。為了更好地管理客服聊天窗口,我們可以藉助PHP語言進行微信開發。一、PHP微信開發簡介PHP是一種開源的伺服器端腳本語言,廣泛用於Web開發領域。結合微信公眾平台提供的開發接口,我們可以使用PHP語言進行微信

隨著網路和行動智慧型裝置的發展,微信成為了社交和行銷領域不可或缺的一部分。在這個越來越數位化的時代,如何使用PHP進行微信開發已經成為了許多開發者的關注點。本文主要介紹如何使用PHP進行微信發展的相關知識點,以及其中的一些技巧和注意事項。一、開發環境準備在進行微信開發之前,首先需要準備好對應的開發環境。具體來說,需要安裝PHP的運作環境,以及微信公眾平台提
