Laravel Cashier SCA订阅创建后stripe_status为incomplete问题咨询
原因说明
- 核心是本地订阅状态没有和Stripe服务端同步:Laravel Cashier不会在用户前端完成SCA认证后立刻主动拉取最新状态,默认依赖Stripe异步推送的Webhook事件更新本地数据。用户完成认证后,Stripe会发送
customer.subscription.updated、payment_intent.succeeded事件到你的服务端,只有正确处理这些事件,subscriptions表的stripe_status才会从incomplete更新为active。 - 本地开发场景下如果你的服务没有公网可访问的地址,Stripe无法推送Webhook事件到本地,也会导致状态一直停留在
incomplete。 - 部分场景下Webhook推送存在延迟,用户跳转回你的站点时事件还没到,也会暂时显示
incomplete状态。
解决方法
- 配置Stripe Webhook
在Stripe后台配置Webhook端点,指向Cashier默认自带的/stripe/webhook路由,勾选所有订阅、支付意图相关的事件,再把Stripe生成的Webhook密钥配置到项目.env文件的STRIPE_WEBHOOK_SECRET字段即可。本地开发可以用Stripe CLI转发事件到本地服务,不需要配置公网地址。 - 跳转后主动同步状态
在你设置的回调路由get.premium.settings对应的处理逻辑中,增加主动同步订阅状态的代码,示例如下:
$user = Auth::user(); $subscription = $user->subscription('default'); if ($subscription && $subscription->stripe_status === 'incomplete') { // 主动从Stripe拉取最新状态更新本地 $subscription->syncStripeStatus(); }
- 检查Webhook签名校验是否正常,如果签名校验失败,Cashier会直接丢弃收到的Webhook事件,也不会更新本地状态,确认
.env里的STRIPE_WEBHOOK_SECRET和Stripe后台给出的完全一致即可。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

