Instamojo支付集成Webhook异常:CSRF排除配置未生效
解决Instamojo Webhook因CSRF验证失败的问题
我一眼就发现问题所在了——你配置的CSRF排除路径和实际的Webhook路由完全不匹配,这就是为什么验证没被跳过的原因!
问题分析
你的Webhook路由是:
Route::post('webhook','HomeController@webhook');
这意味着实际接收Instamojo回调的URL是/webhook,但你在VerifyCsrfToken中间件的$except数组里添加的是instamojo/*——这个路径规则根本匹配不到/webhook,所以CSRF验证依然会触发,导致Webhook请求被拦截。
解决方案
1. 修正CSRF排除路径
直接把你的Webhook路由路径添加到$except数组里:
class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'webhook', // 匹配你的/webhook路由 ]; }
如果之后你打算把Webhook路由放到instamojo前缀下(比如Route::post('instamojo/webhook', ...)),再改用instamojo/*就没问题了。
2. 确认Instamojo的Webhook配置
登录Instamojo后台,检查你设置的Webhook URL是否和你的路由完全一致。比如你的应用域名是https://your-app.com,那么Webhook URL必须是https://your-app.com/webhook,不能有拼写错误或者多余的后缀。
3. 额外排查步骤
- 检查其他中间件拦截:如果你的路由组还应用了其他中间件(比如权限验证),确保这些中间件也不会拦截
/webhook请求。 - 测试请求是否到达控制器:可以在
webhook方法里临时添加日志输出,验证请求是否能正常到达:
然后用Postman发送一个POST请求到use Illuminate\Support\Facades\Log; public function webhook(Request $request) { Log::info('Instamojo Webhook Received', $request->all()); return response()->json(['status' => 'success'], 200); }/webhook,查看storage/logs/laravel.log里是否有对应的日志记录。 - 清理配置缓存:修改中间件后,执行以下命令清理缓存,确保新配置生效:
php artisan config:clear php artisan cache:clear
内容的提问来源于stack exchange,提问作者Hari17
相关产品推荐
相关产品推荐

