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
相关产品推荐
相关产品推荐

