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

Stripe最新版本中如何替代已移除的duration参数?

解决Stripe按月计费3个月后自动停用的订阅方案

首先明确你提到的两种方法的问题:

  • 用recurring: {interval: 'month', interval_count: 3}是设置每3个月计费一次的订阅,和你需要的「按月计费、连续3个月后停用」逻辑完全不符,这个方案不可行。
  • 直接用cancel_at: Math.floor(Date.now() / 1000) + 60*60*24*90确实存在你担心的风险:自然月天数不固定(比如2月仅28/29天),固定90天的时间戳和实际3个计费周期的结束时间会出现偏差,极端情况下会导致订阅在第四个计费周期启动前未取消,进而产生第四次扣费。

可靠的实现方案

推荐两种官方认可的稳妥方式:

方案1:基于订阅周期结束时间精准设置cancel_at

创建订阅时不使用固定天数计算,而是基于Stripe返回的周期时间,算出第三个计费周期的结束时间作为cancel_at的值:

  1. 先创建基础订阅(暂不设置cancel_at),获取Stripe返回的订阅对象。
  2. 从对象中提取current_period_end(第一个周期结束时间),在此基础上增加2个自然月(Stripe会自动适配不同月份的天数差异),得到第三个周期的结束时间。
  3. 调用订阅更新API,将该时间设置为cancel_at参数值。

示例代码(Node.js):

// 创建初始按月订阅
const subscription = await stripe.subscriptions.create({
  customer: 'cus_XXX',
  items: [{ price: 'price_XXX' }], // 此处price为预先创建的按月计费价格ID
});

// 计算第三个计费周期的结束时间
const thirdPeriodEnd = new Date(subscription.current_period_end * 1000);
thirdPeriodEnd.setMonth(thirdPeriodEnd.getMonth() + 2);
const cancelAtTimestamp = Math.floor(thirdPeriodEnd.getTime() / 1000);

// 更新订阅,设置自动取消时间
await stripe.subscriptions.update(
  subscription.id,
  { cancel_at: cancelAtTimestamp }
);

方案2:使用Stripe Subscription Schedules(订阅计划)

这是官方专门为固定周期场景设计的方案,可直接创建包含3个计费阶段的订阅,到期自动停用:
通过定义3次按月计费的阶段,计划结束后自动取消订阅,完全规避时间计算误差。

示例代码(Node.js):

const schedule = await stripe.subscriptionSchedules.create({
  customer: 'cus_XXX',
  start_date: 'now',
  phases: [
    {
      items: [{ price: 'price_XXX', quantity: 1 }],
      iterations: 3, // 执行3次按月计费
    },
  ],
  end_behavior: 'cancel', // 计划结束后自动取消订阅
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:15:10