Laravel集成Stripe Webhook:功能正常但处理代码未执行
1. 修复代码中的语法错误
你的PaymentIntentSucceeded.php里存在明显语法错误:
// 错误:缺少反斜杠的无效use语句 use IlluminateSupportFacadesLog;
修正为:
use Illuminate\Support\Facades\Log;
这个错误会导致Job无法被正确加载,队列处理器执行时会触发致命错误,若队列日志配置不完善,可能无法看到报错信息。
2. 确认队列进程正在运行
由于你的Job实现了ShouldQueue接口,必须确保Laravel队列处理器处于运行状态:
- 本地测试:执行
php artisan queue:work或php artisan queue:listen - 生产环境:使用supervisor等工具守护队列进程,避免进程意外退出
可以查看jobs表(默认database驱动),确认是否有未处理的Job记录堆积。
3. 验证Webhook签名密钥
检查.env中的STRIPE_WEBHOOK_SECRET是否与Stripe仪表盘里的Webhook签名密钥完全一致(注意这不是Stripe API密钥)。签名验证失败时,Spatie包会返回200但不会触发后续Job逻辑。
4. 确认事件类型匹配
Stripe发送的事件类型是payment_intent.succeeded(点分隔格式),虽然Spatie包支持下划线转义(payment_intent_succeeded),但建议直接使用官方标准格式配置:
'jobs' => [ 'invoice_payment_succeeded' => \App\Jobs\StripeWebhooks\InvoicePaymentSucceededJob::class, 'payment_intent.succeeded' => \App\Jobs\StripeWebhooks\PaymentIntentSucceeded::class, ],
5. 检查失败队列记录
执行php artisan queue:failed查看失败任务,或直接查询failed_jobs表,里面会记录Job执行失败的具体错误信息,这是定位问题的关键依据。
6. 临时改为同步执行测试
暂时移除Job类的ShouldQueue接口,让Webhook请求进来时同步执行逻辑:
// 去掉ShouldQueue接口 class PaymentIntentSucceeded { // ... 其他代码保持不变 }
此时重新用Stripe CLI测试,如果日志能正常输出,说明问题出在队列配置或进程上;若仍无日志,需检查Webhook路由是否正确配置。
7. 确认Webhook路由配置
执行php artisan route:list,确认/stripe/webhooks路由存在,且对应的控制器是Spatie\StripeWebhooks\StripeWebhooksController,同时确保该路由未被其他路由规则覆盖,也没有被CSRF中间件拦截(Spatie包默认已排除CSRF验证)。
内容的提问来源于stack exchange,提问作者Hondaman900

