网上很多人说检查授权回调地址配置是否有误,但实际上授权回调地址跟这个异步回调地址没有任何关系。
官方文档已经说得很清楚,所以直接排除这一点。
另外一些答案很多都是说检查配置里面的notify_url配置是否正确,必须是以http或https开头的公网可访问的完整地址(或是本地测试使用Ngrok内网穿透),地址后面不能跟参数等等。这些问题一般来说出现的比较少,而我遇到的也跟这些问题无关。
最后发现在路由配置的时候该回调地址设置的是仅支持get请求,而从上图异步通知的说明中可看见支付宝是通过POST方式请求该地址,所以路由访问必须设置为POST可请求,当然也可以设置any等等。
到此并没有结束,查看日志发现该方法依然没有被请求。只能继续排查,最后发现laravel在post请求时默认是会进行CSRF 保护,因此支付宝在请求该地址因为没有通过令牌验证直接被拦截掉了。为此我们需要关闭该地址的令牌验证,有多种方法解决这个问题。
可以直接注释掉Kernel.php中的VerifyCsrfToken中间件,这样所有的请求都不会进行令牌验证,也可以添加令牌白名单。