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

Stripe Products问题:切换订阅计划后旧计划未被移除

解决新版Stripe API切换订阅计划后旧计划残留的问题

嘿,我之前升级Stripe API到整合了Products的新版本时,也踩过一模一样的坑!给你拆解下原因和解决办法:

问题根源

新版Stripe API调整了订阅更新的默认行为——旧版里调用更新订阅时,默认会替换原有的订阅计划;但新版默认是追加新的订阅项目到现有订阅中。这就导致你切换到Plan B后,Plan A的订阅项目还留在用户名下,当你再切回Plan A时,因为同一个订阅里不能存在两个相同Plan的项目,就触发了那个重复计划的错误。

解决方案

你需要修改订阅更新的代码,明确告诉Stripe要替换现有订阅项目,而不是追加。这里有两种常用的方式:

方式1:更新现有订阅项目

先获取当前订阅里的旧项目ID,然后直接更新这个项目的Plan:

// 1. 获取当前订阅的信息,拿到现有订阅项目ID
var existingSub = await new SubscriptionService().GetAsync("用户的订阅ID");
var oldItemId = existingSub.Items.Data.First().Id;

// 2. 构建更新参数,指定更新旧项目的Plan
var updateOptions = new SubscriptionUpdateOptions
{
    SubscriptionItems = new List<SubscriptionItemOptions>
    {
        new SubscriptionItemOptions
        {
            Id = oldItemId,
            Plan = "新的Plan ID(比如plan_B或plan_A)"
        }
    },
    // 可选:设置 prorate 行为,比如不生成 prorations
    ProrationBehavior = ProrationBehavior.None
};

// 3. 执行更新
var updatedSub = await new SubscriptionService().UpdateAsync("用户的订阅ID", updateOptions);

方式2:直接替换所有订阅项目

如果你确定用户只需要一个订阅项目,可以用ReplaceSubscriptionItems参数直接替换整个列表:

var updateOptions = new SubscriptionUpdateOptions
{
    SubscriptionItems = new List<SubscriptionItemOptions>
    {
        new SubscriptionItemOptions
        {
            Plan = "新的Plan ID"
        }
    },
    // 关键参数:替换所有现有订阅项目,只保留新的
    ReplaceSubscriptionItems = true,
    ProrationBehavior = ProrationBehavior.None
};

var updatedSub = await new SubscriptionService().UpdateAsync("用户的订阅ID", updateOptions);

额外注意点

  • 如果你的业务场景允许用户同时订阅多个Plan(比如不同Products),那不要用方式2,而是针对性更新每个订阅项目
  • 测试时记得检查Stripe Dashboard里的订阅详情,确认旧的订阅项目已经被移除,只有新的Plan存在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:14:15