故障現象:微信后臺配置都正確,但是同步微信菜單時總是報出“token錯誤,請稍后重試”的提示。
問題分析:如果兩邊配置都沒有問題,這個可能是由于token在kvstore中緩存值不對導致的,系統會優先使用緩存值。
解決辦法:
方法是強制刷新緩存值。
將文件“ /app/weixin/lib/wechat.php”復制一份放到二次開發目錄中,修改其中的get_basic_accesstoken方法,大約在112行,如下:
// 獲取微信基礎信息ACCESS_TOKEN public function get_basic_accesstoken($bind_id){ if( base_kvstore::instance('weixin')->fetch('basic_accesstoken_'.$bind_id, $access_token) !== false){ logger::info('kv獲取ACCESS_TOKEN'.$access_token); return $access_token; }else{ $bindinfo = app::get('weixin')->model('bind')->getRow('appid, appsecret, email',array('id'=>$bind_id)); if( $bindinfo['appid'] && $bindinfo['appsecret']){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$bindinfo['appid']}&secret={$bindinfo['appsecret']}"; $httpclient = kernel::single('base_httpclient'); $response = $httpclient->set_timeout(6)->get($url); $result = json_decode($response, true); if( $result['errcode']==0 ){ if( !base_kvstore::instance('weixin')->store('basic_accesstoken_'.$bind_id, $result['access_token'], $result['expires_in']) ){ // 微信ACCESS_TOKEN的有效期,單位為秒 logger::info("KVSTORE寫入公眾賬號登錄郵箱為 {$bindinfo['email']} 的ACCESS_TOKEN錯誤"); } logger::info('遠程獲取ACCESS_TOKEN'.$result['access_token']); return $result['access_token']; }else{ logger::info("獲取公眾賬號登錄郵箱為 {$bindinfo['email']} 的ACCESS_TOKEN錯誤,微信返回的錯誤碼為 {$result['errcode']}"); return false; } }else{ logger::info("沒有取到公眾賬號ID為 {$bind_id} 的 appid 或者 appsecret 的信息"); return false; } } }
將其中的:
if( base_kvstore::instance('weixin')->fetch('basic_accesstoken_'.$bind_id, $access_token) !== false)
修改為:
if( base_kvstore::instance('weixin')->fetch('basic_accesstoken_'.$bind_id, $access_token) !== false && 1==2)
這樣做的目的是強制重新取得token并存入到kvstore中。
接著去后臺更新微信菜單,更新成功一次后,把剛才修改了的代碼改回去。下次如果修改了公眾號配置,重新操作一次即可。