通过Stripe客户门户更新订阅时如何迁移剩余试用天数
Stripe订阅试用期升降级保留剩余试用天数解决方案
Stripe客户门户默认的订阅升降级规则确实会直接终止当前试用期,想要保留剩余试用时长可以按以下方案实现:
- 优先推荐通过Webhook异步处理,无需修改现有客户portal的配置:
- 配置监听
customer.subscription.updated事件,收到事件后首先比对变更前后的订阅商品ID,确认是升降级操作 - 提取原订阅的
trial_end时间戳,减去当前时间戳得到剩余的试用秒数,仅当剩余秒数大于0时执行后续操作 - 调用Stripe订阅更新接口,给新的订阅设置
trial_end为「当前时间戳+剩余试用秒数」,同时设置proration_behavior为none,避免产生分段计费账单
- 配置监听
注意:需要在Stripe后台开启Webhook事件的
previous_attributes返回配置,才能拿到变更前的订阅trial_end字段
- 如果你后续计划自定义订阅管理页面,也可以不走默认客户门户的升降级逻辑,用户提交升降级申请时直接计算剩余试用天数,创建新订阅时直接传入
trial_end参数,逻辑更加可控,无需额外处理Webhook事件。
附核心实现代码示例(Node.js):
// customer.subscription.updated 事件处理逻辑 const stripe = require('stripe')('你的Stripe密钥'); exports.handleSubscriptionUpdate = async (event) => { const newSub = event.data.object; const prevSub = event.data.previous_attributes; // 校验是否为试用期内的升降级操作 if (!prevSub.items || !prevSub.trial_end || prevSub.trial_end < Date.now()/1000) return; const remainingTrial = prevSub.trial_end - Math.floor(Date.now()/1000); if (remainingTrial <= 0) return; // 更新新订阅试用时长 await stripe.subscriptions.update( newSub.id, { trial_end: Math.floor(Date.now()/1000) + remainingTrial, proration_behavior: 'none', payment_behavior: 'default_incomplete' } ); }
内容的提问来源于stack exchange,提问作者Louis Coulet
相关产品推荐
相关产品推荐

