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的值:
- 先创建基础订阅(暂不设置
cancel_at),获取Stripe返回的订阅对象。 - 从对象中提取
current_period_end(第一个周期结束时间),在此基础上增加2个自然月(Stripe会自动适配不同月份的天数差异),得到第三个周期的结束时间。 - 调用订阅更新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
相关产品推荐
相关产品推荐

