如何基于使用限额通过Stripe实现订阅套餐自动续费?
实现Stripe额度包自动续购方案
核心逻辑
你的场景属于预付费额度包自动续购:用户订阅固定用量的套餐,当使用量耗尽时,自动从用户绑定的支付方式扣款,重新发放对应额度。结合你已完成的Stripe集成、套餐配置和使用追踪系统,通过「业务触发+Stripe API调用+Webhook回调」即可实现。
具体实现步骤
1. 确保用户已保存可离线扣款的支付方式
用户首次订阅时,必须让支付方式标记为可用于后续离线扣款,这是自动续购的前提:
- 创建订阅时的关键参数(以Python为例):
stripe.Subscription.create( customer="cus_XXX", # 你的用户对应的Stripe Customer ID items=[{"price": "price_XXX"}], # 对应abcd套餐的定价ID payment_behavior="default_incomplete", expand=["latest_invoice.payment_intent"], setup_future_usage="off_session" # 核心:标记支付方式可用于无用户交互的离线扣款 )
- 若用户未保存支付方式,需先通过Stripe Elements收集支付信息,将其保存为
PaymentMethod并关联到对应Customer对象。
2. 使用量触发生成自动续购请求
当你的系统检测到用户使用量达到限额时,执行以下操作:
方式一:重复创建同一定价的订阅(适合需要保留订阅关系的场景)
new_sub = stripe.Subscription.create( customer="cus_XXX", items=[{"price": "price_XXX"}], off_session=True, # 明确为离线无交互模式 payment_settings={ "save_payment_method": True # 确保后续续购仍可使用该支付方式 } )
方式二:创建一次性Payment Intent扣款(适合无需订阅周期的单次额度购买)
intent = stripe.PaymentIntent.create( amount=1000, # 套餐金额,单位为分(示例为10美元) currency="usd", customer="cus_XXX", payment_method="pm_XXX", # 用户已保存的支付方式ID off_session=True, confirm=True, # 自动尝试扣款 )
3. 通过Webhook处理续购结果
必须配置Stripe Webhook监听支付事件,完成业务闭环:
- 监听
payment_intent.succeeded:扣款成功后,在你的数据库中重置用户的使用额度,标记续购完成。 - 监听
payment_intent.payment_failed:扣款失败时,记录失败原因,限制用户继续使用服务,并触发通知(如邮件提醒用户更新支付方式)。
4. 异常情况处理
- 支付方式失效:若用户信用卡过期、余额不足,Stripe会返回支付失败。需提供页面让用户通过Stripe Elements重新绑定支付方式,并更新关联的Customer对象。
- 额度准确性:每次扣款成功后,务必准确重置用户使用量计数器,避免重复扣钱或额度发放错误。
关键注意事项
- 所有离线扣款操作必须标记
off_session: True,符合Stripe合规要求。 - 开启Stripe Webhook并验证签名,确保事件来源真实可靠。
- 用户首次订阅时,需明确告知“使用额度耗尽将自动扣款续购”,符合隐私和支付合规规范。
内容的提问来源于stack exchange,提问作者Wanten
相关产品推荐
相关产品推荐

