You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Cashier(Stripe):无法在Stripe Checkout中更新账单地址

问题诊断与解决方案

核心问题原因

当订阅处于incomplete状态时,Stripe默认付款重试邮件中的链接,是基于现有订阅的已绑定账单规则生成的Checkout会话,默认不允许修改账单地址——这是因为初始创建订阅时你指定了billing_address_collection => 'required',Stripe会认为账单地址是订阅的固定属性,而非可重试时修改的内容。你需要明确配置让Stripe在重试场景下允许更新账单地址。


具体解决方法

方法一:生成支持地址修改的自定义重试Checkout会话

放弃依赖Stripe默认的付款邮件链接,自己监听Webhook事件并生成允许修改地址的Checkout会话:

  1. 首先确保Webhook监听invoice.payment_failed事件(Cashier默认已处理,但你可以自定义逻辑)
  2. 当收到支付失败事件时,生成新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:40:03