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

基于Node.js使用Stripe订阅更新API实现升降级的最优方案咨询

Stripe订阅升降级最优实现方案(Node.js)

核心逻辑直接使用Stripe原生的订阅更新接口替换订阅项下的商品即可,无需新建订阅、删除旧订阅,Stripe原生支持升降级的生效时间、计费规则配置,完全覆盖你的业务需求。

一、Basic升级到Plus(立即生效场景)

你之前的先加后删逻辑会导致短时间双产品、额外计费的问题,完全可以规避。正确做法是直接调用subscriptions.update接口替换原有订单项,操作是直接覆盖原有订阅下的商品,不会新增额外订单项,完全不会出现同订阅下同时持有两款产品的问题。

const stripe = require('stripe')('你的Stripe密钥');

const updatedSubscription = await stripe.subscriptions.update(
  '用户当前持有的Basic订阅ID', // 直接用用户现有订阅ID修改
  {
    items: [{
      id: '订阅下原有Basic商品的订单项ID', // 从原订阅对象的items.data[0].id取值
      price: 'Plus产品的价格ID', // 替换为Stripe后台Plus对应的订阅价格ID
    }],
    proration_behavior: 'create_prorations', // 立即补收当前周期剩余时间的差价,不需要补费可设为none,下个周期再收全额Plus费用
    payment_behavior: 'default_incomplete', // 自动处理支付失败场景,避免订阅直接失效
    expand: ['latest_invoice.payment_intent']
  }
);

二、Plus降级到Basic(周期结束后生效场景)

不需要给当前订阅设到期取消、也不需要新建订阅加试用期,直接指定变更生效时间为当前周期结束时间即可,所有逻辑Stripe自动处理,无需额外维护定时任务。

const stripe = require('stripe')('你的Stripe密钥');

// 先获取当前订阅的周期结束时间戳
const currentSubscription = await stripe.subscriptions.retrieve('用户当前Plus订阅ID');
const nextBillingCycleTimestamp = currentSubscription.current_period_end;

const updatedSubscription = await stripe.subscriptions.update(
  '用户当前的订阅ID',
  {
    items: [{
      id: '订阅下原有Plus商品的订单项ID',
      price: 'Basic产品的价格ID',
    }],
    proration_behavior: 'none', // 降级不产生折算扣费
    proration_date: nextBillingCycleTimestamp, // 变更仅在当前周期结束、下个周期开始时生效
    payment_behavior: 'default_incomplete',
    expand: ['latest_invoice.payment_intent']
  }
);

注意事项

  • 操作时用到的价格ID需对应Stripe后台recurring 类型的订阅价格,不可使用一次性商品的价格
  • 如果你的订阅包含多个订单项,仅修改需要替换的目标订单项ID即可,其余订单项保持原有配置不变
  • 建议监听Stripe的customer.subscription.updated webhook事件来同步业务系统的订阅状态,不要完全依赖接口返回结果做状态变更,可靠性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:39:02