Laravel Cashier Stripe Webhooks无法触发:返回302未执行对应方法
以下是几个核心排查方向:
CSRF保护拦截
Laravel默认会对所有POST请求做CSRF验证,但Stripe的Webhook请求是外部发起的,不会携带CSRF token。需要在app/Http/Middleware/VerifyCsrfToken.php的$except数组中添加Webhook路由:protected $except = [ 'stripe/webhooks', ];路由请求方法错误
检查路由定义,确保Webhook路由使用POST方法:// 手动定义路由 Route::post('stripe/webhooks', [StripeWebhookController::class, 'handleWebhook']); // 或使用Cashier路由宏 Route::cashierWebhooks('stripe/webhooks');控制器方法命名或继承错误
确认StripeWebhookController正确继承自Laravel\Cashier\Http\Controllers\WebhookController,且处理方法命名严格遵循规则:handle+ 驼峰化的事件名,比如customer.subscription.updated对应handleCustomerSubscriptionUpdated,注意拼写和大小写完全匹配。不必要的中间件拦截
检查Webhook路由是否被应用了auth这类需要登录的中间件,外部请求会被重定向到登录页返回302。确保路由排除无关中间件:Route::post('stripe/webhooks', [StripeWebhookController::class, 'handleWebhook']) ->withoutMiddleware(['auth', 'verified']);签名密钥配置错误
确认.env文件中的STRIPE_WEBHOOK_SECRET和Stripe后台设置的Webhook签名密钥完全一致。签名验证失败时,部分场景下会触发中间件的错误重定向。本地环境HTTPS强制重定向
如果本地配置了强制HTTPS(比如通过中间件或服务器配置),localhost的请求可能被重定向。可以尝试关闭本地HTTPS强制,或使用ngrok等工具暴露HTTPS服务测试。
内容的提问来源于stack exchange,提问作者codingIsLove

