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,我這麼寫好像就是屬於用業務邏輯刷新,用第三方中控什麼意思呢
把方法的絕對路徑放在二維碼產生器裡,掃描。這樣調試的結果比瀏覽器直接存取正確點感覺。
多數情況下,瀏覽器開啟如果報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,我這麼寫好像就是屬於用業務邏輯刷新,用第三方中控什麼意思呢
把方法的絕對路徑放在二維碼產生器裡,掃描。這樣調試的結果比瀏覽器直接存取正確點感覺。
多數情況下,瀏覽器開啟如果報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是基於使用者的,你這樣每個使用者一次就刷一次了。
建議放到快取或資料庫,定期刷新。