Stripe订阅:如何在订阅期中途赠送1个月免费时长?
Stripe订阅延长计费周期解决方案(推荐赠时长场景)
针对你需要实现的「推荐成功后为6个月订阅用户延长1个月免费时长,保持原定价与后续计费周期」的需求,以下是两种可行的Stripe实现方案:
方案一:直接更新订阅周期结束时间(单次延长首选)
通过修改订阅的current_period_end字段,直接延后当前计费周期的结束时间,同时设置不产生任何额外费用,后续计费将自动沿用原6个月周期规则。
代码示例(Python SDK)
import stripe from datetime import datetime from dateutil.relativedelta import relativedelta stripe.api_key = "sk_test_你的密钥" # 获取目标订阅 subscription = stripe.Subscription.retrieve("sub_XXX") # 计算新的周期结束时间:原结束时间+1个月 current_end_dt = datetime.fromtimestamp(subscription.current_period_end) new_end_dt = current_end_dt + relativedelta(months=1) new_end_ts = int(new_end_dt.timestamp()) # 更新订阅 updated_sub = stripe.Subscription.modify( subscription.id, current_period_end=new_end_ts, proration_behavior="none" # 禁止产生 prorate 费用,确保免费延长 )
该方案的效果完全匹配你的需求:
- 原1月1日开通的6个月订阅,原结束时间7月1日,修改后变为8月1日
- 8月1日将自动按原6个月定价扣费,下一次计费日期为次年2月1日
- 全程无额外扣费,无需修改定价
方案二:使用订阅日程(多次/复杂延长场景)
如果需要支持多次推荐、多次延长周期的场景,使用Stripe订阅日程(Subscription Schedule)可以更灵活地管理订阅的多个阶段。
代码示例(Python SDK)
import stripe from datetime import datetime from dateutil.relativedelta import relativedelta stripe.api_key = "sk_test_你的密钥" subscription = stripe.Subscription.retrieve("sub_XXX") # 创建基于现有订阅的日程,调整当前阶段结束时间,后续保持原周期 schedule = stripe.SubscriptionSchedule.create( from_subscription=subscription.id, phases=[ # 第一阶段:延长当前周期1个月 { "start_date": subscription.current_period_start, "end_date": int((datetime.fromtimestamp(subscription.current_period_end) + relativedelta(months=1)).timestamp()), "items": [ {"price": subscription.items.data[0].price.id, "quantity": 1} ], "proration_behavior": "none" }, # 后续阶段:保持原6个月订阅规则 { "items": [ {"price": subscription.items.data[0].price.id, "quantity": 1} ], "interval": "month", "interval_count": 6 } ] )
注意事项
- 计算1个月时长时,使用
relativedelta(months=1)比固定秒数更准确,能自动适配不同月份的天数差异 - 若用户是预付费订阅(已支付6个月费用),
proration_behavior="none"会确保延长周期不会产生任何扣费 - 之前使用的
pause_collection仅能暂停计费,无法延长订阅周期,因此不适用于你的场景
内容的提问来源于stack exchange,提问作者Tartempion34
相关产品推荐
相关产品推荐

