首先看下流程:
微信內調用網頁授權,首先是服務器發起訪問一個微信網頁授權的地址,帶上回調地址。這個發起訪問一般都沒問題,按照那個文檔來就可以,然後微信會主動訪問你那個自己服務器的回調地址,並且帶上一個參數code,然後自己的服務器接收到這個參數後,就把這個參數組裝加密什麼的,再去訪問相關地址獲取access_token,最終獲取到用戶信息,獲取用戶信息後,服務器還必須 反一個頁面給用戶,
那麼在接到code到最終反一個頁面給用戶的過程中,如果本身程序就有錯誤,特別是在使用了這個code過後的出錯,服務器反會錯誤了,那麼這個時候,微信會根據最上面的原理,再次開啓另外一個IP來訪問,並且同樣帶和上次一樣的code參數。這樣你服務器又會去根據這個code參數去完成同樣一次申請,這個時候,你表面上看起,就是報40163錯誤。說code被用了,但實際上是因爲微信被迫開啓另外一個ip來訪問你的。。
但是正常流程微信只會訪問一次你的授權接口。
以下是我的解決過程:
1、根據打印日誌查看code是否獲取到,我的是接口調用兩次,第二次和第一次的code打印出來不一樣,在網上查了很多,有人說是code被使用,第二次訪問就會報此錯誤,也有人說是你的邏輯代碼執行時間太長,超過十秒,微信就會再調用一次你的接口,這時就會報錯,但是我打印出來執行時間並沒有超過10s.可能這個有用,但是對我的問題來說並沒有什麼作用
2、會不會是code過期。根據這個想法,我把第一次獲取到的code存在redis中,等到用的時候,直接從redis中取,超過5分鐘的 則重新獲取code(總所周知微信網頁授權獲取到的 code 只能使用一次 ,5分鐘內有效),一旦使用就移除,保證每次使用的code都是有效的。但是這個方法對我的問題還是沒有解決。
3、會不會是自己邏輯代碼有問題。通過對邏輯代碼的打印,查看,結果發現在最後一步返回數據時出了問題,這個簡直了,修改後,問題立馬解決。瞬間有種想抽死自己的感覺,找了一天的問題居然是這個。
其實報這個錯誤不是人家微信的錯誤,與其說別人的錯,還不如多看看自己寫的代碼,沒茅臺~