1. 程式人生 > >關於微信獲取access_token在同一伺服器覆蓋的解決方法

關於微信獲取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的時候也需要使用鍵值對來儲存。