Laravel Cashier(Stripe):无法在Stripe Checkout中更新账单地址
问题诊断与解决方案
核心问题原因
当订阅处于incomplete状态时,Stripe默认付款重试邮件中的链接,是基于现有订阅的已绑定账单规则生成的Checkout会话,默认不允许修改账单地址——这是因为初始创建订阅时你指定了billing_address_collection => 'required',Stripe会认为账单地址是订阅的固定属性,而非可重试时修改的内容。你需要明确配置让Stripe在重试场景下允许更新账单地址。
具体解决方法
方法一:生成支持地址修改的自定义重试Checkout会话
放弃依赖Stripe默认的付款邮件链接,自己监听Webhook事件并生成允许修改地址的Checkout会话:
- 首先确保Webhook监听
invoice.payment_failed事件(Cashier默认已处理,但你可以自定义逻辑) - 当收到支付失败事件时,生成新的Checkout会话,明确允许更新账单地址:
// 在Webhook处理逻辑或订阅编辑页面中 $user = User::where('stripe_id', $event->data->object->customer)->first(); $subscription = $user->subscription('default'); $checkoutSession = $user->checkout([ 'mode' => 'subscription', 'subscription' => $subscription->stripe_id, 'success_url' => route('subscription.edit'), 'cancel_url' => route('subscription.edit'), 'billing_address_collection' => 'required', 'automatic_tax' => ['enabled' => true], 'allow_update' => [ 'billing_address' => true // 明确允许修改账单地址 ], 'payment_method_collection' => 'always' ]); // 将$checkoutSession->url通过自定义邮件发送给用户
方法二:修改初始订阅创建的参数
在创建初始结账会话时,添加payment_behavior参数,并确保Stripe后台配置允许地址修改:
$request->user()->newSubscription('default', 'price_......')->checkout([ 'success_url' => route('subscription.edit'), 'cancel_url' => route('subscription.edit'), 'billing_address_collection' => 'required', 'automatic_tax' => ['enabled' => true], 'payment_behavior' => 'default_incomplete', // 明确设置订阅创建逻辑 'allow_promotion_codes' => true ]);
然后进入Stripe后台:
- 进入「设置」→「付款设置」→「付款重试」
- 开启「允许客户在付款重试时更新账单地址」选项
方法三:禁用Stripe自动邮件,完全自定义流程
在Stripe后台关闭自动付款失败邮件,完全通过自己的Webhook事件处理逻辑发送带自定义Checkout链接的邮件,确保用户始终进入支持地址修改的页面。
内容的提问来源于stack exchange,提问作者andcl
相关产品推荐
相关产品推荐

