關於微信獲取access_token在同一伺服器覆蓋的解決方法
今天公司要求做一個接微信硬體,程式碼完成後,測試時(使用的不同的公眾號),發現一臺手機關注後計入應用界掃描成功後,其他的都無法掃描成功,進過測試,發現了一個坑,就是access_token的覆蓋。當一臺手機掃描後,如果使用其他手機再次掃描,由於access_token的有效時間還在,那麼就會使用之前的access_token,這樣掃描不會成功,因此解決這個坑就需要在每個不同公眾號id下管理一個access_token,這樣就不會出現問題。
之前我們儲存了access_token是這樣的;
private static string mToken = "";//微信access_token
private static DateTime mGetTokenTime;//本次獲取access_token的時間 access_token每110分鐘超時一次
這樣不同的公眾號id其實在7200秒內是相同的access_token,會出現覆蓋的問題
因此修改變數程式碼;
private static Dictionary<string, string> mTokenList = new Dictionary<string, string>();//微信access_token集合 解決同一臺伺服器變數替換的問題
private static Dictionary<string, DateTime> mTokenTimeList = new Dictionary<string, DateTime>();//本次獲取access_token的時間集合 access_token每100分鐘超時一次
這樣一來的每一個鍵值都儲存不同的access_token。
在獲取access_token時就應該通過鍵值對來獲取:
private static string getMToken(string appId)
{
string access_token= (mTokenList.Count > 0 && mTokenList.ContainsKey(appId) ? mTokenList[appId] : "");
return access_token;
}
時間差
private static bool timeOut(string appId)
{
if (mTokenTimeList.Count == 0) {
return true;
}
if (!mTokenTimeList.ContainsKey(appId))
{
return true;
}
TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - mTokenTimeList[appId].Ticks);
return ts.Minutes > 110;
}
獲取access_token:
public static void GetAccessToken(string appId, string appSecret)
{
string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
string content = WebApply.GET(url);
if (!content.Contains("errcode"))
{
string wxtoken=content.Replace("\"", "").Split(new char[] { ',' })[0].Split(new char[] { ':' })[1];
if (mTokenList.ContainsKey(appId))
{
mTokenList.Remove(appId);
}
mTokenList.Add(appId, wxtoken);
if (mTokenTimeList.ContainsKey(appId))
{
mTokenTimeList.Remove(appId);
}
mTokenTimeList.Add(appId, DateTime.Now);
}
}
同理在獲取jsapi_ticket的時候也需要使用鍵值對來儲存。