已存在订阅计划时,如何处理Stripe订阅升级?
Stripe订阅场景下「带降级计划时主套餐升级」的官方最优方案
问题核心矛盾
已有附加组件降级订阅计划时,直接修改订阅计划阶段升级主套餐,会生成1小时后自动收款的草稿发票,且变更不依赖支付状态就生效,不符合「支付成功才生效」的需求;但订阅计划本身不支持payment_behavior=pending_if_incomplete参数。
官方推荐方案:阶段调整+发票事件触发生效
无需走「释放计划→更新订阅→重建计划」的繁琐流程,通过以下步骤实现:
修改订阅计划当前阶段时,强制生成即时可收款发票
更新订阅计划的当前阶段(替换为主套餐升级后的价格)时,通过invoice_settings参数禁用草稿发票,同时指定proration_behavior=always_invoice:stripe.SubscriptionSchedule.modify( "sub_sched_xxxx", phases=[ { "items": [ {"price": "UPGRADED_MAIN_PLAN_ID", "quantity": 1}, # 保留原附加组件的降级计划配置 {"price": "ADDON_PLAN_ID", "quantity": 1} ], "start_date": "now", "invoice_settings": { "collection_method": "charge_automatically", "days_until_due": 0 } } ], proration_behavior="always_invoice" )此操作会立即生成待支付发票而非草稿,Stripe会尝试即时扣款。
通过Webhook监听支付状态,控制变更生效时机
- 默认订阅计划的阶段变更不会立即生效,需等待支付确认后触发
- 监听
invoice.paid事件:收到后再次调用SubscriptionSchedule.modify,将当前阶段的start_date设为now,强制变更立即生效 - 监听
invoice.payment_failed事件:若支付失败,回滚订阅计划阶段配置到升级前状态
保留原有降级计划
主套餐升级生效后,原有附加组件的降级阶段配置会保留在订阅计划中,无需重新创建。
备选简化方案:即时订阅变更+计划导入
如果上述方案适配复杂,可采用:
- 先对当前订阅执行即时升级,传入
payment_behavior=pending_if_incomplete和prorate_behavior=always_invoice,确保支付成功才变更订阅 - 支付成功后,调用
SubscriptionSchedule.create将升级后的订阅导入为新计划,并追加原附加组件的降级阶段配置
这种方式既满足升级的支付生效逻辑,又能保留后续的降级计划安排。
内容的提问来源于stack exchange,提问作者DrakkoFire
相关产品推荐
相关产品推荐

