2 回答

TA貢獻1853條經驗 獲得超9個贊
需要重新獲取code,然后得到access token。 即要重新調用授權界面。需要用refresh token刷新access token。
關于access token過期的解決辦法:
是在內層函數中,如果執行失敗,并且是access_token過期的異常,則會在request的時候拋出專門的異常。
在外圍函數如果接收到了這個異常,則會拋出讓裝飾器接收到,裝飾器收到這個異常后會刪掉緩存中的token,并且重新執行該函數,這樣該函數在執行的時候,就會去主動的獲取最新的token。
assess token過期的原因:
測試服和線上服使用同一個app_id和secret來獲取,可能會存在其中一方獲取的token是舊的。
代碼中沒有統一的從一個地方來獲取,而是直接從官網獲取,導致不統一(看了代碼,沒有發現單獨獲取token的地方)。
請求獲取新的token的時候失?。☉摬豢赡埽驗檎埱蟪晒σ院髸趓edis中緩存兩個小時,但是發現沒過多久又再次失效,因此主要原因應該不是這個)。
異步隊列等待的時間較長,正好執行的時候token已經更新(應該不可能,獲取token是在異步函數中執行,而不是通過函數參數來傳遞)。

TA貢獻1783條經驗 獲得超4個贊
我們通過一些手段嘗試性的觸發問題現象:
1、測試環境下,清空access_token的redis數據。
2、正常測試,功能ok,查看access_token的redis內容,這里假設值為A。
3、手動調用接口刷新access_token,大概十幾次后,值變化為B。
4、再次正常測試,發現功能異常(因為此時存儲在redis的access_token已經過期)。
5、清空access_token的redis數據,再次測試,功能又恢復正常。
現在問題終于變成必現的了:)
解決方案
現在我們搞清楚問題的原因是存儲在redis的access_token可能在很短的時間內過期(因為有太多中控服務器啦),但是我們一般設置的有效期都接近或等于7200s,這就導致一旦出現問題的話,如果不清理redis,問題就會持續2小時左右,這簡直就是災難!
目前想到的比較理想的解決方案就是:服務器發現功能異常時,刷新access_token并更新redis,然后再次調用接口。這種容錯機制本來是微信的事-_-!
添加回答
舉報