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

Stripe中在计费周期结束时降级订阅的正确方法

Stripe 订阅延迟降级(周期结束后生效)的正确实现

你的第二段代码存在问题:设置cancel_at_period_end: true会让订阅在当前计费周期结束后直接取消,而不是降级,这不符合你的需求。

错误代码分析

  • 第一段代码直接调用subscriptions.update修改了订阅的price,即使设置了proration_behavior: 'none',订阅也会立即变更,所以导致了即时降级。
  • 第二段代码的cancel_at_period_end: true是用于取消订阅的参数,无法实现降级效果。

正确实现方式:使用订阅计划(Subscription Schedules)

Stripe官方推荐用订阅计划来处理需要延迟生效的订阅变更,比如周期结束后的降级。具体步骤是创建一个包含两个阶段的订阅计划:第一阶段保持当前订阅配置到周期结束,第二阶段自动切换为降级后的价格。

代码示例:

// 获取当前订阅详情
const currentSubscription = await stripe.subscriptions.retrieve(user.stripeSubscriptionId);

// 创建订阅计划,安排延迟降级
const schedule = await stripe.subscriptionSchedules.create({
  from_subscription: user.stripeSubscriptionId, // 关联当前订阅
  phases: [
    // 第一阶段:维持当前订阅,直到周期结束
    {
      end_date: currentSubscription.current_period_end,
      items: [
        {
          id: currentSubscription.items.data[0].id,
          price: currentSubscription.items.data[0].price.id,
          quantity: 1,
        },
      ],
    },
    // 第二阶段:周期结束后自动切换到降级后的价格
    {
      items: [
        {
          price: prod_env, // 你的降级后价格ID
          quantity: 1,
        },
      ],
      metadata: {
        plan: productName,
        userId: userId.toString(),
      },
    },
  ],
});

关键说明

  • from_subscription:将当前订阅关联到计划中,保留原有的计费周期和状态。
  • 第一阶段的end_date设置为当前订阅的current_period_end,确保当前订阅持续到周期结束。
  • 第二阶段会在第一阶段结束后自动生效,实现无感知的周期后降级。
  • 不要直接调用subscriptions.update修改price,这会导致订阅立即变更,无法延迟生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:16:15