access_token管理
在將access_token之前,還有兩個重要參數需要知曉,這兩個參數分別是appID和appsecret,這是在申請公衆號的時候自動分配給公衆號的,相當於公衆號的身份標示,在很多接口中需要這兩個參數,接下來在請求access_token的時候就需要這兩個參數。
公衆號接入成功之後,接下來就要實現相應的邏輯了。在使用微信公衆號接口中,發現有許多請求都需要access_token。access_token是公衆號的全局唯一憑證,公衆號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將導致上次獲取的access_token失效。並且每天調用獲取access_token接口的上限是2000次。
總結以上說明,access_token需要做到以下兩點:
1.因爲access_token有2個小時的時效性,要有一個機制保證最長2個小時重新獲取一次;
2.因爲接口調用上限每天2000次,所以不能調用太頻繁;
就此,這裏採用的方案是這樣的,定義一個默認啓動的servlet,在init方法中啓動一個Thread,這個進程中定義一個無限循環的方法,用來獲取access_token,當獲取成功後,此進程休眠7000秒,否則休眠3秒鐘繼續獲取。流程圖如下:
下面正式開始在工程中實現以上思路,因爲返回的數據都是json格式,這裏會用到阿里的fastjson庫,爲構造請求和處理請求後的數據序列化和反序列化提供支持。後續的其它接口也會用到。
1.定義一個AccessToken實體
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
2.定義一個默認啓動的servlet,在init方法中啓動一個Thread,並在web.xml中將這個servlet設置爲默認自啓動的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
在web.xml中設置servlet自啓動,並設置初始化參數appid和appsecret
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
3.定義Thread類,在此類中調用access_token獲取接口,並將得到的數據抽象到靜態實體,以便在其它地方使用。接口地址爲https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET,其中grant_type固定寫爲client_credential即可。此請求爲https的get請求,返回的數據格式爲{"access_token":"ACCESS_TOKEN","expires_in":7200}。
進程類實現如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
其中NetWorkHelper中getHttpsResponse方法是請求一個https地址,參數requestMethod爲字符串“GET”或者“POST”,傳null或者“”默認爲get方式。
實現如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
|
至此代碼實現完畢,將項目部署,看到控制檯輸出如下:
爲方面看效果,可以把休眠時間設置短一點,比如30秒獲取一次,然後將access_token輸出。下面做一個測試jsp頁面,並把休眠時間設置爲30秒,這樣過30秒刷新頁面,就可以看到變化,順便演示一下在其它地方如何拿到access_token
1 2 3 4 5 6 7 8 9 10 |
|
這樣在瀏覽器上瀏覽這個頁面,顯示效果如下:
30秒後刷新,這個值發生了變化:
代碼已上傳至github,倉庫會隨時更新,目前只有本篇所講的代碼。
歡迎關注公衆號「gushidefengzheng」古時的風箏