最近两天在做laravel框架下的微信公众号的开发,碰到一个很蛋疼的坑。把问题和解决方法写出来,留给自己做个备份。
中英文的故障提示
这个坑主要是,按照easywechat的教程,在laravel框架内写完了serve()方法后,无法接收到返回的微信验证的字符串,导致在关注微信公众号后出现以下提示:
中文版错误提示:“该公众号暂时无法提供服务,请稍微再试”
英文版错误提示:“Official account services unavailable. Try again later.”
bug原因揭晓
出现这个bug,主要是因为easywechat的文档不够详细。在写到中间件这个部分,一笔带过导致很多人调入坑里。这个bug的关键是因为,laravel的路由在启用“web”中间件后,会开启CSRF保护。而微信消息的发送和响应,是不带laravel的token的。所以开启用web中间件后,关注微信公众号的用户,由于缺少token导致请求被laravel的中间件被拦截。
解决方法
其实,解决问题的方法很简单。只要在VerifyCsrfToken.php这个中间件里,排除掉所有不需要laraveld的’web’中间件保护的路由即可。
排除路由的写法
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
‘/wechat/serve’,
];
}
这里要注意,$execpt数组里的路由的url一定要写完整和正确。所有不需要csrf保护的微信公众号里的url,每一个都要写在$execpt里。
特别提示
这个用于验证服务器权限的验证,不能使用wechat.oauth中间件。