zoukankan      html  css  js  c++  java
  • C#微信开发之旅(四):AccessToken获取及全局管理

    由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关、生成二维码、获取用户信息、菜单操作等等)

    下面是AccessToken全局管理的单例类,(原理:通过微信接口获取AccessToken,存储在内存中,当其他项目调用时,会判断是否过期,过期去拿新Token再返回):

     1 /// <summary>
     2     /// AccessToken类,公众号通过此token 获取相关信息 (单例类)
     3     /// </summary>
     4     public sealed class AccessToken
     5     {
     6         private static AccessToken _Token = new AccessToken();
     7 
     8         private static object lock_Object = new object();
     9 
    10         /// <summary>
    11         /// 此处 会判断是否过期,没过期返回原存储的Token
    12         /// </summary>
    13         public static AccessToken Instance
    14         {
    15             get
    16             {
    17                 if (_Token.Expired)
    18                 {
    19                     lock (lock_Object)
    20                     {
    21                         if (_Token.Expired)
    22                         {
    23                             _Token.CreateTime = DateTime.Now;
    24                             _Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
    25                         }
    26                     }
    27                 }
    28 
    29                 return _Token;
    30             }
    31         }
    32 
    33         /// <summary>
    34         /// 此处会创建新的Token返回,只有在调用接口提示AccessToken过期时 才调用这个接口。
    35         /// </summary>
    36         /// <returns></returns>
    37         public static AccessToken CreateNewInstance()
    38         {
    39             lock (lock_Object)
    40             {
    41                 _Token.CreateTime = DateTime.Now;
    42                 _Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
    43             }
    44             return _Token;
    45         }
    46 
    47         private AccessToken()
    48         {
    49             CreateTime = DateTime.Now;
    50             _expiresIn = -1;
    51         }
    52 
    53         private string _accessToken;
    54         private int _expiresIn;
    55         public DateTime CreateTime;
    56         public string Access_Token
    57         {
    58             get { return _accessToken; }
    59             set { _accessToken = value; }
    60         }
    61 
    62         /// <summary>
    63         /// 有效时间,秒
    64         /// </summary>
    65         public int Expires_In
    66         {
    67             get { return _expiresIn; }
    68             set { _expiresIn = value; }
    69         }
    70 
    71         public bool Expired
    72         {
    73             get
    74             {
    75                 DateTime expiredTime = CreateTime.AddSeconds(_expiresIn);
    76 
    77                 if (DateTime.Now > expiredTime)
    78                     return true;
    79 
    80                 return false;
    81             }
    82         }
    83 
    84         public void CopyModel(AccessToken token)
    85         {
    86             //token 为空,将 过期时间 设置为 -1
    87             if (token == null)
    88             {
    89                 this.Expires_In = -1;
    90                 return;
    91             }
    92 
    93             this.Access_Token = token.Access_Token;
    94             this.Expires_In = token.Expires_In;
    95 
    96         }
    97     }

    这个类提供了两个出口,Instance和CreateNewInstance ,区别是 CreateNewInstance 直接调用微信接口生成新的AccessToken(请确保只在 AccessToken过期时使用),由于本人之前的项目,微信不是只我们一家开发,所以导致AccessToken 经常出现过期情况,才会多出这个方法。 如果可以保证所有用到AccessToken的地方都调用WCF的话,可以不需要这个逻辑。

    下面是 获取AccessToken的代码,经过各种封装,简单的不能再简单了,这个方法在WeiXinHelper(核心类,在后续随笔中慢慢讲)中,HttpClientHelper请看:C#微信开发之旅(二):基础类之HttpClientHelper

            /// <summary>
            /// 获取Access_Token
            /// </summary>
            /// <returns></returns>
            public static string GetAccessToken()
            {
                string url = WeiXinConst.WeiXin_AccessTokenUrl;
                string result = HttpClientHelper.GetResponse(url);
                return result;
            }
  • 相关阅读:
    Linux下mysql的自动定时备份
    javaweb面试题
    java面试题
    Web应用优化之nginx+tomcat集群配置+redis管理session
    Web应用系统通常可以经过哪些层面的优化
    HBase安装
    博客园所有文章字数统计
    Python生成器
    Python列表生成式
    直方图均衡化-Python实现
  • 原文地址:https://www.cnblogs.com/hetring/p/4048158.html
Copyright © 2011-2022 走看看