2 回答

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

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
我們通過一些手段嘗試性的觸發(fā)問題現(xiàn)象:
1、測試環(huán)境下,清空access_token的redis數(shù)據(jù)。
2、正常測試,功能ok,查看access_token的redis內(nèi)容,這里假設(shè)值為A。
3、手動(dòng)調(diào)用接口刷新access_token,大概十幾次后,值變化為B。
4、再次正常測試,發(fā)現(xiàn)功能異常(因?yàn)榇藭r(shí)存儲(chǔ)在redis的access_token已經(jīng)過期)。
5、清空access_token的redis數(shù)據(jù),再次測試,功能又恢復(fù)正常。
現(xiàn)在問題終于變成必現(xiàn)的了:)
解決方案
現(xiàn)在我們搞清楚問題的原因是存儲(chǔ)在redis的access_token可能在很短的時(shí)間內(nèi)過期(因?yàn)橛刑嘀锌胤?wù)器啦),但是我們一般設(shè)置的有效期都接近或等于7200s,這就導(dǎo)致一旦出現(xiàn)問題的話,如果不清理redis,問題就會(huì)持續(xù)2小時(shí)左右,這簡直就是災(zāi)難!
目前想到的比較理想的解決方案就是:服務(wù)器發(fā)現(xiàn)功能異常時(shí),刷新access_token并更新redis,然后再次調(diào)用接口。這種容錯(cuò)機(jī)制本來是微信的事-_-!
添加回答
舉報(bào)