使用Laravel Cashier与Stripe订阅:数据未写入数据库问题咨询
问题解答
核心原因
redirectToBillingPortal() 是Stripe提供的订阅管理工具,原本定位是给已有订阅的用户做后续管理——比如修改支付方式、切换订阅计划、取消订阅,默认不支持创建新订阅。
如果你确实在账单门户中完成了订阅创建操作,那大概率是你在Stripe后台开启了「允许客户创建新订阅」的功能,但这种绕过Laravel Cashier的操作,Cashier不会自动将Stripe端的订阅数据同步到本地的subscriptions和subscription_items表,这属于正常表现。Cashier本地数据的写入,要么是通过自身的订阅创建方法触发,要么依赖Stripe Webhook事件的推送同步。
解决办法分两种场景:
1. 常规创建订阅(推荐方案)
不要通过账单门户处理新订阅,改用Laravel Cashier自带的订阅流程:
- 使用
$user->newSubscription('default', 'price_xxx')->create($paymentMethodId)这类方法,直接在应用内完成订阅创建,Cashier会自动将数据写入本地数据表,同时同步到Stripe平台。 - 也可以用Cashier的
checkout()方法生成Stripe Checkout链接,引导用户完成订阅支付,这种方式同样会自动同步本地数据。
2. 必须通过账单门户创建订阅
如果业务场景确实需要走账单门户创建订阅,那就必须配置Stripe Webhooks来同步数据到本地:
- 登录Stripe后台,在「Webhooks」模块启用
customer.subscription.created和customer.subscription.updated两个事件。 - 在Laravel应用中配置Webhook路由,复用Cashier自带的Webhook处理逻辑:
你的控制器可以直接继承Cashier的Route::post('/stripe/webhook', [App\Http\Controllers\StripeWebhookController::class, 'handleWebhook']);WebhookController,或者调用其内置的处理方法。当Stripe触发订阅创建事件时,Cashier会自动将数据写入本地的订阅相关数据表。
补充:Stripe账单门户的配置说明
若要让账单门户支持创建新订阅,需要在Stripe Dashboard的「设置」→「账单门户」→「功能」中,开启「允许客户创建新订阅」的选项,但即便开启该功能,仍需依赖Webhooks完成本地数据同步,Cashier不会主动拉取Stripe端的订阅信息。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

