微信公众号Token验证失败的几种情况及解决办法
1. 思路看验证的文件,编码是否是:utf-8 无bom头的
2. thinkphp框架,要关闭调试模式,开启调试模式容易有错误代码出现,导致验证失败
3. 当是框架路由地址时,接收的参数里,会有个_URL_单元,要把这个单元删除。
下边是部分代码publicfunctionindex(){
//判断是否是第一次接入echostr
if(!empty($_GET['echostr'])){
echo$this->checkSign();
}else{
//接收处理数据
$this->acceptMsg();
}
}
/**
*初次接入校验
*@returnstring
*/
privatefunctioncheckSign()
{
//得到微信公众号发过来的数据
$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'';
}
}