来源:自学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