故障现象:微信后台配置都正确,但是同步微信菜单时总是报出“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中。
接着去后台更新微信菜单,更新成功一次后,把刚才修改了的代码改回去。下次如果修改了公众号配置,重新操作一次即可。