首页 > 代码库 > C#微信开发之旅(三):AccessToken获取及全局管理

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         /// 此处 会判断是否过期,没过期返回原存储的Token12         /// </summary>13         public static AccessToken Instance14         {15             get16             {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_Token57         {58             get { return _accessToken; }59             set { _accessToken = value; }60         }61 62         /// <summary>63         /// 有效时间,秒64         /// </summary>65         public int Expires_In66         {67             get { return _expiresIn; }68             set { _expiresIn = value; }69         }70 71         public bool Expired72         {73             get74             {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 为空,将 过期时间 设置为 -187             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;        }

 

C#微信开发之旅(三):AccessToken获取及全局管理