由于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; }
时间: 2024-10-12 22:49:29