zoukankan      html  css  js  c++  java
  • 微信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;
    
             
     
        }
    
  • 相关阅读:
    用代码控制CListCtrl的一行高亮显示或选择的问题
    机械版CG 实验3 变换
    机械版CG 实验5 Bezier曲线
    机械版CG 实验4 裁剪
    Avoiding UpdateData(ZZ)
    机械版CG 实验6 简单光照明模型实现
    机械版CG 实验2 直线生成算法的实现
    最近太忙了,没有时间打理Blog
    仿雅虎首页巨幅广告
    XML串行化,低层类
  • 原文地址:https://www.cnblogs.com/mqingqing123/p/8882513.html
Copyright © 2011-2022 走看看