微信公众号Token验证失败的几种情况及解决办法
1. 思路看验证的文件,编码是否是:utf-8 无bom头的
2. thinkphp框架,要关闭调试模式,开启调试模式容易有错误代码出现,导致验证失败
3. 当是框架路由地址时,接收的参数里,会有个_URL_单元,要把这个单元删除。
下边是部分代码public function index(){
// 判断是否是第一次接入 echostr
if (!empty($_GET['echostr'])) {
echo $this->checkSign();
} else {
// 接收处理数据
$this->acceptMsg();
}
}
/**
* 初次接入校验
* @return string
*/
private function checkSign()
{
// 得到微信公众号发过来的数据
$input = $_GET;
// 把echostr放在临时变量中
$echostr = $input['echostr'];
$signature = $input["signature"];
// 在数组中删除掉
unset($input['echostr'], $input['signature'],$input['_URL_']);
// 在数据中添加一个字段token
$input['token'] = self::TOKEN;
/*=========== 微信发来的数据 ==========*/
{"signature":"086cdab9031c8ed0168e1a0942fb811bbe1b239a",
"echostr":"2179111007072545391",
"timestamp":"1587789869",
"nonce":"825612036",
"_URL_":["Wxcallback","index"]
}
以上【_URL_】这个当框架路由时会有,所以要删掉否则生成字符验证不通过
最后input数组只剩下
["timestamp"=>"1587789609","nonce"=>"177753193","token"=>"abcd789"]
/*========================*/
// 进行字段排序
$tmpStr = implode( $input );
// 进行加密操作
$tmpStr = sha1( $tmpStr );
// 进行对比
if( $tmpStr == $signature ){
// 校验成功要返回echostr
return $echostr;
}else{
return '';
}
}