微信Access Token 缓存方法
微信Access Token默认缓存是2小时,但是需要特别强调,微信服务号和微信企业号缓存并不相同。
(1)微信公众号号:每次Http请求Access Token 系统会返回不同的Token,并附带超时时间,默认是2小时。
(2)微信企业号:每次请求Access Token,默认有效期为2个小时,在这2个小时内获取的Access Token是一样的。
对于微信公众号,我们通过txt存储每次获取的Access Token。换句话说,当缓存后,再次获取Access时,直接从txt里获取。代码如下:
  private static string wxml = HttpContext.Current.Server.MapPath("~/app_data/access_token.txt");
      
    public static string GetAccessToken()
    {
        string json = "";
        DateTime dt = DateTime.Now;
        if (!System.IO.File.Exists(wxml))
        {
           //txt不存在,创建
            json = GetTokenFromURL();
        }
        else
        {
            json = System.IO.File.ReadAllText(wxml);
        }
        //获取最后txt写入的时间
        dt = System.IO.File.GetLastWriteTime(wxml);
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AccessToken));
        var mStream = new MemoryStream(Encoding.Default.GetBytes(json));
        AccessToken token = (AccessToken)serializer.ReadObject(mStream);
        //_expires_in默认为 7200秒,也就是2小时,也就是access_token2小时即失效。为了保证可靠性,系统让access_tokey 1.5小时失效。 
        int minRefreshTimeSpan = 1800 - int.Parse(token.expires_in);  // -5400秒
        if (minRefreshTimeSpan > 0)
        {
            minRefreshTimeSpan = -1800;
        }
        if (dt < DateTime.Now.AddSeconds(minRefreshTimeSpan))
        {
            GetTokenFromURL();
            json = System.IO.File.ReadAllText(wxml);
            serializer = new DataContractJsonSerializer(typeof(AccessToken));
            mStream = new MemoryStream(Encoding.Default.GetBytes(json));
            token = (AccessToken)serializer.ReadObject(mStream);
        }
        return token.access_token;
    }
    private static string GetTokenFromURL()
    {
        string appid = AppID;
        string secret = AppSecret;
        string strUrl = Access_Token_URL;
        string json =   HttpUtility.SendGetHttpRequest(strUrl);
        System.IO.File.WriteAllText(wxml, json);
        return json;
    }
(2)对于企业微信AccessToken,可以使用单列模式存储
   private   static DateTime _lastGetTimeOfAccessToken = DateTime.Now.AddSeconds(-7201);
    private static string _AccessToken="";
    public static string GetAccessToken()
    {
        if (_lastGetTimeOfAccessToken < DateTime.Now )
        {
            var rsEntity = new { access_token = "", expires_in = 0, errcode = 0, errmsg = "" };
            string json = GetTokenFromURL();
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AccessToken));
            var mStream = new MemoryStream(Encoding.Default.GetBytes(json));
            AccessToken token = (AccessToken)serializer.ReadObject(mStream); 
            _lastGetTimeOfAccessToken = DateTime.Now.AddSeconds( int.Parse(token.expires_in) - 1);
            _AccessToken = token.access_token;
           
        }
        return _AccessToken;
         
 
    }
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号