由於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; }