作者:dghghjkk_952 | 来源:互联网 | 2023-05-17 18:01
由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关、生成二维码、获取用户信
由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关、生成二维码、获取用户信息、菜单操作等等)
下面是AccessToken全局管理的单例类,(原理:通过微信接口获取AccessToken,存储在内存中,当其他项目调用时,会判断是否过期,过期去拿新Token再返回):
1 ///
2 /// AccessToken类,公众号通过此token 获取相关信息 (单例类)
3 ///
4 public sealed class AccessToken
5 {
6 private static AccessToken _Token = new AccessToken();
7
8 private static object lock_Object = new object();
9
10 ///
11 /// 此处 会判断是否过期,没过期返回原存储的Token
12 ///
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(WeiXinHelper.GetAccessToken()));
25 }
26 }
27 }
28
29 return _Token;
30 }
31 }
32
33 ///
34 /// 此处会创建新的Token返回,只有在调用接口提示AccessToken过期时 才调用这个接口。
35 ///
36 ///
37 public static AccessToken CreateNewInstance()
38 {
39 lock (lock_Object)
40 {
41 _Token.CreateTime = DateTime.Now;
42 _Token.CopyModel(JsonConvert.DeserializeObject(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 ///
63 /// 有效时间,秒
64 ///
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
///
/// 获取Access_Token
///
///
public static string GetAccessToken()
{
string url = WeiXinConst.WeiXin_AccessTokenUrl;
string result = HttpClientHelper.GetResponse(url);
return result;
}