网站地图    收藏   

主页 > 后端 > 微信开发 >

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

来源:自学PHP网    时间:2015-04-14 12:58 作者: 阅读:

[导读] 由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到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;
        }

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论