C#微信開發之旅(四):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;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM