首先不得不提到access_token的分類,一是普通access_token,二是網頁授權access_token。其中前者是用于調用微信提供的各種借口,作為開發者的調用憑證,一般有效期為7200s,獲取次數受限;另一種是第三方網頁若需要使用用戶微信賬戶登錄,需要獲取該access_token從而來獲取用戶微信賬戶信息。這個一定得區分開。
另外獲取用戶微信賬戶信息也有兩種情況,一是普通的獲取用戶信息,它只需要調用微信用戶信息接口即可獲取,因而使用到的是第一種普通access_token,另一種就是上面提到的網頁授權時獲取用戶信息。一旦二者概念混淆,則會報出invalid access_token錯誤。
對于第一種普通access_token,需要注意到的是,它是全局性的,就是一旦獲取到了新的access_token,原有的access_token就會失效,而無法調用相關接口。而這種特性,導致的情況是,多個不同進程相互獨立獲取access_token時,會直接影響到其他進程調用相關微信接口,這種異常通常對應著 access_token失效異常。
為了解決這種情況,必須獨立啟動一個線程定時去獲取access_token,并由該線程向所有其他線程提供該access_token,從而避免access_token獲取混亂導致的失效問題。我實現該想法的方式是采用timer定時器,定時刷新獲取access_token,并將其存入到指定property文件中,其他線程通過讀取該文件中的access_token值,來調用相關接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@controller @requestmapping (value = "/timer" ) public class acesstokentimer { private static final string appid = "*************" ; private static final string appsecret = "*********" ; private timer timer = new timer( true ); @postconstruct public void settoken(){ if ( null == timer){ timer = new timer( true ); } timer.scheduleatfixedrate( new timertask() { @override public void run() { try { systemutil.setstring( "token.properties" , "access_token" , urlgetutil.get( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" +appid+ "&secret=" +appsecret).getstring( "access_token" )); } catch (exception e){ e.printstacktrace(); } } }, 0 , 3600 * 1000 ); } } |
在定時器任務中獲取和寫入access_token值。該類基于springmvc框架,此處用到了@postconstruct標簽,它的作用是,在spring框架初始化完成之后,及執行對應方法體,直白地說就是開機自啟。
access_token失效和刷新
目前想到的比較理想的解決方案就是:服務器發現功能異常時,刷新access_token并更新redis,然后再次調用接口。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/u013248535/article/details/52613632