Laravel 8仅Stripe Webhook POST请求出现Attempt to read property on null错误
问题成因分析
- 竞态时序问题:Stripe的
charge.succeeded事件是异步推送的,存在回调请求比你系统内创建StripePayments记录的逻辑先执行的可能。你手动调试时是主动触发请求,时序完全可控,因此不会复现;只有真实生产场景下的异步回调会触发该问题。 - 未提交事务可见性问题:如果
StripePayments记录的写入逻辑包裹在数据库事务中,事务未完成提交时,回调请求的查询属于事务外操作,无法读取到未提交的临时记录,因此返回null。你后续调试时事务已经提交,自然能正常查询到结果。 - 查询值隐形差异问题:你调试时肉眼看到的
$charge->payment_intent字符串和实际数据库存储的值可能存在隐形差异:比如回调返回值带了多余的空格、换行符,或者数据库排序规则为大小写敏感时,回调返回值和存储值的大小写不匹配,都会导致查询匹配失败。 - 多环境/重试脏数据问题:如果该Job配置了重试规则,可能首次执行失败后你删除了对应记录,重试时自然查询不到;也可能存在Stripe回调地址配置错误,生产环境的回调请求打到了测试环境,测试环境不存在对应支付记录。
临时修复方案
先做空值判断避免直接报错,异常场景可设置延迟重试:
$paymentRecord = StripePayments::where('payment_intent', $charge->payment_intent)->first(); if (is_null($paymentRecord)) { // 延迟10秒后重试Job,等待支付记录写入完成 release(10); return; } $customer_referal = $paymentRecord->worker_id;
内容的提问来源于stack exchange,提问作者Alem Tatarević
相关产品推荐
相关产品推荐

