解决laravel框架下微信公众号“公众号暂时无法提供服务”的坑

Posted by

最近两天在做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中间件。

Leave a Reply

Your email address will not be published. Required fields are marked *