PHP实现微信公众号验证Token的示例代码(2)
Laravel的代码怎么写
首先,强势插个口播(在使用过TP5,CodeIgniter, CakePHP, Yii, Slim之后,我认为Laravel是目前来说最好的PHP框架,不接受其他任何意见。)
其次,验证代码上面是跟纯PHP大同小异的,唯一的区别是在你处理POST请求的时候一定要让Laravel不要检测CSFR Token,否则会出现错误。
首先,设置路由:
Route::any('wx', [
'uses' => 'WeChatApp@checkSignature'
]);
#坑点,看下面的常见坑介绍
其次,取消Laravel的CSFR检查:
#去到你的Middlewarel里面找到VerifyCsrfToken.php然后插入下面代码:
protected $except = [
'wx', #注意这个是你在第一步设置的路由路径,不接受单独的文件路径,太Low逼了
];
最后,上酸菜:
#在你对应的Controller里面加入以下函数
public function checkSignature( Request $request ) {
$input = $request->all();
# 一定要抓取4个参数
$echoStr = $input[ "echostr" ];
$signature = $input[ "signature" ];
$timestamp = $input[ "timestamp" ];
$nonce = $input[ "nonce" ];
# 微信官方验证方式
$token = env( 'TOKEN' ); #或者用config()函数
$tmpArr = [ $token, $timestamp, $nonce ];
sort( $tmpArr, SORT_STRING );
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
# 打印返回结果
if( $tmpStr == $signature ){
return response($echoStr);
} else{
return response();
}
}
常见的坑是什么
文档坑。有些人看过官方文档之后直接就上代码了,缺忽略了里面的一个参数echostr 随机字符串 而这个恰恰是验证服务器的关键点,你要打印这个返回给微信才能通过验证。但是官方文档说的不够重点。
Laravel路由坑。一定要设置请求为any这样包括(GET跟POST)
Laravel还有一个测试的坑,就是如果你的APP_DEBUG=false如果不是false的话可能会造成抛出多余的字串导致验证失败。
要学会使用微信官方测试工具 https://mp.weixin.qq.com/debug/ 选择消息接口测试跟文本消息接口就行。其他的可以看图说话

微信UI的坑。在你通过上面的测试后,并不真正代表你启用了服务器。而是在你保存后要点击启用,然后看到红色 停用 才真正的是真正的启用了。
白名单坑。你一定要去到微信的安全中心设置你的服务器的
