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

升级Stripe免费订阅至付费订阅时的支付信息收集与关联问题

问题

我的应用会自动为所有用户创建带有Free价格的Stripe Subscription,无需收集支付详情。当用户升级至Paid套餐时,按照Stripe官方订阅升级降级文档的方式更新Subscription,但因客户无支付信息导致API调用失败。

调用代码如下:

stripe_client.subscriptions.update(
    subscription_id,
    {
        "expand": ["latest_invoice.payment_intent"],
        "items": [
            {
                "id": subscription_item_id,
                "price": price,
                "quantity": quantity,
            }
        ],
    },
)

报错信息:

This customer has no attached payment source or default payment method. Please consider adding a default payment method. For more information, visit https://stripe.com/docs/billing/subscriptions/payment-methods-setting#payment-method-priority.

我未使用嵌入式页面,而是采用自定义流程。请问在此流程中应如何收集支付详情?我的目标是在用户尝试订阅Paid套餐时收集支付详情,随后收取订阅费用(通过升级订阅实现)。我了解可手动创建Payment Intent或Setup Intent,但如何将其与Subscription关联?


解决方案

针对自定义流程下的付费套餐升级场景,你需要先收集用户的支付方式并关联到对应客户,再执行订阅更新操作,具体步骤如下:

1. 创建Setup Intent收集支付方式

Setup Intent用于安全收集并保存用户的支付方式(无需立即扣费),适配订阅场景。后端先创建Setup Intent:

setup_intent = stripe_client.setup_intents.create(
    customer=customer_id,
    payment_method_types=["card"]  # 根据业务支持的支付方式调整
)

前端使用Stripe Elements加载支付表单,传入Setup Intent的client_secret,引导用户输入支付信息并完成确认。确认成功后,你会得到一个payment_method_id。

2. 将支付方式设为客户的默认支付方式

把收集到的支付方式关联到客户,并设置为默认,确保后续订阅扣费能自动使用:

stripe_client.payment_methods.attach(
    payment_method_id,
    customer=customer_id
)

stripe_client.customers.update(
    customer_id,
    invoice_settings={
        "default_payment_method": payment_method_id
    }
)

3. 执行订阅更新操作

完成支付方式关联后,再调用你原来的订阅更新代码即可正常执行,Stripe会自动生成发票并尝试扣费。

另外,也可以在更新订阅时指定payment_behavior参数为default_incomplete,让Stripe自动生成需要用户确认的支付流程,但这种方式更适配嵌入式页面场景,自定义流程还是推荐先手动收集并关联支付方式的方案。

内容的提问来源于stack exchange,提问作者csirmazbendeguz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:52:03