首頁 > 後端開發 > php教程 > 微信獲取多次取得全域的access_token衝突導致無效? (算是解決)

微信獲取多次取得全域的access_token衝突導致無效? (算是解決)

WBOY
發布: 2023-03-02 10:20:01
原創
3143 人瀏覽過

token預設是7200秒過期,如果有第二地方也要求同一個token的話,那麼第一個token會在5分鐘內過期。也就是說我第二次請求的時候如果時間過短會引起衝突。
剛學習微信開發,程式碼寫的不是很完美。只過了是否大於7200生存期的判斷,看到有人說可以判斷每分鐘讀取,不知道各位大大對我的代碼有什麼優化建議?謝謝

<code>function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}
</code>
登入後複製
登入後複製

起衝突的是同一個控制器下的一個方法,每次呼叫都是用

<code>    $access_token=$this->getWxAccessToken();
</code>
登入後複製
登入後複製

報錯資訊如下

<code>array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}
</code>
登入後複製
登入後複製

看到官方說的
0.0官方的意思就是不要用業務邏輯點去刷新token,我這麼寫好像就是屬於用業務邏輯刷新,用第三方中控什麼意思呢
微信獲取多次取得全域的access_token衝突導致無效? (算是解決)


把方法的絕對路徑放在二維碼產生器裡,掃描。這樣調試的結果比瀏覽器直接存取正確點感覺。
多數情況下,瀏覽器開啟如果報40001,基本上程式是沒問題的

回覆內容:

token預設是7200秒過期,如果有第二地方也要求同一個token的話,那麼第一個token會在5分鐘內過期。也就是說我第二次請求的時候如果時間過短會引起衝突。
剛學習微信開發,程式碼寫的不是很完美。只過了是否大於7200生存期的判斷,看到有人說可以判斷每分鐘讀取,不知道各位大大對我的代碼有什麼優化建議?謝謝

<code>function getWxAccessToken(){
    if ( $_SESSION['access_token'] && $_SESSION['expire_time'] > time() ) {
        //未过期
        return $_SESSION['access_token'];
    }else {
        $appid        = "wx3bbf9ae731a6eb07";
        $appsecret = "2b14a75fa48825ef3c76c8949b5e030f";
        $url          = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$appid."&secret=".$appsecret;
        $res =$this->https_request($url,'get','json');
        $access_token = $res["access_token"];
        //将重新获取到的access_token存到session里
        $_SESSION['access_token']=$access_token;
        $_SESSION['expire_time']=time()+7200;
        return $access_token; 
    }
}
</code>
登入後複製
登入後複製

起衝突的是同一個控制器下的一個方法,每次呼叫都是用

<code>    $access_token=$this->getWxAccessToken();
</code>
登入後複製
登入後複製

報錯資訊如下

<code>array(2) {
  ["errcode"] => int(40001)
  ["errmsg"] => string(81) "invalid credential, access_token is invalid or not latest hint: [pd4MfA0688vr40!]"
}
</code>
登入後複製
登入後複製

看到官方說的
0.0官方的意思就是不要用業務邏輯點去刷新token,我這麼寫好像就是屬於用業務邏輯刷新,用第三方中控什麼意思呢
微信獲取多次取得全域的access_token衝突導致無效? (算是解決)


把方法的絕對路徑放在二維碼產生器裡,掃描。這樣調試的結果比瀏覽器直接存取正確點感覺。
多數情況下,瀏覽器開啟如果報40001,基本上程式是沒問題的

建議將access_token儲存到資料庫,這樣各處業務都使用同一個token,這樣就不會發生每個業務邏輯點各自請求access_token的情況了;
官方文檔的意思是如果業務邏輯在多台伺服器上,由於access_token和expire_time儲存在session中,伺服器之間不會共用session,就會導致每台伺服器上的業務都會發起請求,如果其中一台伺服器上的access_token尚未逾時,而另一台伺服器重新請求了access_token ,使得第一台伺服器上的access_token失效,繼而使用過期的access_token去請求服務,導致服務不穩定
使用中控伺服器儲存access_token,這樣統一服務,不會發生業務之間的衝突,保證了資料的一致性

access_token對所有的呼叫是通用的,沒必要放session,每個人的session又不一樣,一般放緩存裡面,要不然你就放資料庫就好了。
每次用到的時候都去資料庫裡面差有效期限內的話,直接用,失效的話重新獲取,再插入資料庫。

session是基於使用者的,你這樣每個使用者一次就刷一次了。
建議放到快取或資料庫,定期刷新。

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板