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

如何用Python/Django通过Stripe将订阅从PlanA切换到PlanB

Stripe订阅计划切换问题解决方案

问题描述

我可以使用以下代码为客户创建Stripe订阅:

subscription = stripe.Subscription.create(
    customer=stripe_customer_id,
    items=[
        { "plan": stripe_plan_A },
    ]
)

尝试用以下代码将订阅从stripe_plan_A升级为stripe_plan_B时,同一用户下出现了两个订阅(实际是订阅内新增了一个订阅项,导致用户同时拥有两个订阅计划):

stripe.Subscription.modify(
    subscription.id,
    items=[
        { "plan": selected_membership.stripe_plan_B },
    ]
)

原因

直接在Subscription.modify的items参数中传入新计划,默认行为是添加新的订阅项,而非替换原有订阅项,最终导致同一订阅下存在两个不同的计划条目,看起来像是用户有两个订阅。

正确解决方案

要实现订阅计划的流畅切换,需要替换原有订阅项而非新增,有两种常用方式:

方式1:指定原有订阅项ID进行修改

先获取原订阅中的订阅项ID,再通过修改该订阅项的plan来完成切换:

# 获取原订阅的第一个订阅项ID
original_item_id = subscription.items.data[0].id

# 修改订阅,替换原有订阅项的计划
updated_subscription = stripe.Subscription.modify(
    subscription.id,
    items=[
        {
            "id": original_item_id,
            "plan": selected_membership.stripe_plan_B
        }
    ],
    # 可选:设置 prorate=False 避免按比例计费,根据业务需求调整
    prorate=False,
    # 可选:设置 payment_behavior="default_incomplete" 处理支付失败场景
    payment_behavior="default_incomplete"
)

方式2:使用replace=true替换所有订阅项

通过replace=true参数告知Stripe用新的订阅项数组替换原有所有订阅项:

updated_subscription = stripe.Subscription.modify(
    subscription.id,
    items=[
        { "plan": selected_membership.stripe_plan_B }
    ],
    replace=True,
    # 可选参数根据业务需求调整
    prorate=False,
    payment_behavior="default_incomplete"
)

额外说明

  • 若需要处理计费周期内的升级/降级计费逻辑,可调整proration_behavior参数(如create_prorations、none等),具体参考Stripe官方文档。
  • 确保切换后订阅状态正常,可通过updated_subscription.status检查订阅状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:25:16