詳解微信開發(fā)之a(chǎn)ccess_token之坑
首先不得不提到access_token的分類,一是普通access_token,二是網(wǎng)頁授權(quán)access_token。其中前者是用于調(diào)用微信提供的各種借口,作為開發(fā)者的調(diào)用憑證,一般有效期為7200S,獲取次數(shù)受限;另一種是第三方網(wǎng)頁若需要使用用戶微信賬戶登錄,需要獲取該access_token從而來獲取用戶微信賬戶信息。這個一定得區(qū)分開。
另外獲取用戶微信賬戶信息也有兩種情況,一是普通的獲取用戶信息,它只需要調(diào)用微信用戶信息接口即可獲取,因而使用到的是第一種普通access_token,另一種就是上面提到的網(wǎng)頁授權(quán)時獲取用戶信息。一旦二者概念混淆,則會報出invalid access_token錯誤。
對于第一種普通access_token,需要注意到的是,它是全局性的,就是一旦獲取到了新的access_token,原有的access_token就會失效,而無法調(diào)用相關(guān)接口。而這種特性,導(dǎo)致的情況是,多個不同進(jìn)程相互獨(dú)立獲取access_token時,會直接影響到其他進(jìn)程調(diào)用相關(guān)微信接口,這種異常通常對應(yīng)著 access_token失效異常。
為了解決這種情況,必須獨(dú)立啟動一個線程定時去獲取access_token,并由該線程向所有其他線程提供該access_token,從而避免access_token獲取混亂導(dǎo)致的失效問題。我實(shí)現(xiàn)該想法的方式是采用timer定時器,定時刷新獲取access_token,并將其存入到指定property文件中,其他線程通過讀取該文件中的access_token值,來調(diào)用相關(guān)接口。
@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); } }
在定時器任務(wù)中獲取和寫入access_token值。該類基于SpringMVC框架,此處用到了@PostConstruct標(biāo)簽,它的作用是,在Spring框架初始化完成之后,及執(zhí)行對應(yīng)方法體,直白地說就是開機(jī)自啟。
access_token失效和刷新
目前想到的比較理想的解決方案就是:服務(wù)器發(fā)現(xiàn)功能異常時,刷新access_token并更新redis,然后再次調(diào)用接口。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot簡單熱部署實(shí)現(xiàn)步驟解析
這篇文章主要介紹了Springboot簡單熱部署實(shí)現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-12-12Spring注解中@Autowired和@Bean的區(qū)別詳解
這篇文章主要詳細(xì)介紹了Spring注解中@Autowired和@Bean二者有什么區(qū)別,文中通過兩個注解的使用場景介紹了二者的區(qū)別,感興趣的同學(xué)可以參考閱讀2023-06-06springMVC實(shí)現(xiàn)圖形驗(yàn)證碼(kaptcha)代碼實(shí)例
這篇文章主要介紹了springMVC實(shí)現(xiàn)圖形驗(yàn)證碼(kaptcha)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值2019-09-09關(guān)于JDK源碼中的@author unascribed注釋閑談
這篇文章主要介紹了關(guān)于JDK源碼中的@author unascribed注釋閑談,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08java代碼實(shí)現(xiàn)斗地主發(fā)牌功能
這篇文章主要介紹了java實(shí)現(xiàn)斗地主發(fā)牌功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11