使用好好的微信功能,突然安卓無法正常使用了,蘋果的正常。
安卓報錯內容:
40163,code been used.
題外話:微信的東西,為何報英文錯誤呢,裝什么13.
實測結果:安卓獲取用戶信息時 ,觸發了兩次請求,而蘋果只請求一次。
各種搜索,各種嘗試,均無效。
沉下來好好想想,再反復測試, 最終發現問題出在獲取用戶信息的 時候,同一個code在短時間內使用了兩次,
public function get_access_token($code){ //基礎token // $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret"; //網頁授權token $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=$this->appId&secret=$this->appSecret&code=$code&grant_type=authorization_code"; $dc['url']=$code; D("ticai_request_log")->add($dc); $res = json_decode($this->httpGet($url)); return $res; }
至於多久后才能使用相同的code,還沒測試出來,
感覺問題在這里,那就在 上一層開始攔截,也就是,如果出現 相同的code時,不用再獲取用戶信息了。
關鍵代碼來了:
if (isset($_GET['code'])){ $code=$_GET['code']; $code_session=session("code"); if($code==$code_session){ //什么都不做 } else{ //緩存起來 session("code",$code,10); //獲取用戶信息 $access_token=$jssdk->get_access_token($_GET['code']); 這時獲取到的openid要緩存起來,后邊的代碼會用到的。 } }
思路:
回調后,獲取到code,與session比較,如果一樣,說明是第二次請求了,什么都不處理,
如果不一樣,說明是初次請求,那就調接口獲取用戶信息吧。
這里好像
只能用session緩存,用cookie無法取到,其實前一天用cookie是沒問題的, 不知道為何第二天又不行了,
明天再測試一下session會不會再出問題,坑人的微信。