Stripe如何实现未填写支付信息时禁止启动试用订阅
Stripe 无有效支付方式禁止启动试用订阅的实现方案
Stripe 没有提供全局一键配置项直接实现「未录入有效支付信息就不生成试用中订阅」的规则,你当前遇到的无效试用订阅问题,本质是订阅创建时机和Stripe默认逻辑不匹配,通过流程调整即可100%解决,不需要找隐藏配置项。
现有流程的核心问题
你当前的流程是用户选定套餐就立刻调用接口创建customer和带试用规则的subscription,Stripe的默认逻辑是:只要订阅创建请求合法,不管绑定的客户下有没有有效可扣款的支付方式,订阅都会直接进入trialing状态。如果用户后续在填写银行卡环节中途退出,这条订阅记录就会一直保留试用中状态,还可能触发后续无效的试用到期催缴、账单生成逻辑,产生脏数据。
可落地的两种实现方案
方案1:后移订阅创建时机(首选,零脏数据)
这是Stripe官方推荐的标准试用流程,完全不会产生无支付方式的无效试用订阅,改造成本极低:
- 用户选定带试用期的套餐环节,只在你的自有业务库生成待确认的订单记录,不要调用Stripe的订阅创建接口
- 先调用Stripe接口生成
SetupIntent,引导用户录入银行卡信息,全程不要信任前端返回的操作结果,只监听Stripe服务端推送的setup_intent.succeededwebhook事件,以此判定用户已经成功绑定了有效可扣款的支付方式 - 收到支付方式绑定成功的事件后,再调用Stripe订阅创建接口,传入对应customer_id、已经绑定的支付方式ID、套餐对应的price_id,同时通过
trial_period_days或trial_end参数配置试用期时长,此时生成的订阅才会正式进入trialing状态,从根源上避免用户中途退出产生的无效记录。
方案2:保留现有创建逻辑,增加自动清理规则(适合不想大改流程的场景)
如果业务上必须在用户选套餐环节就创建订阅,可以通过规则兜底清理无效数据:
- 创建订阅时,将
payment_settings.save_default_payment_method参数设为on_subscription,同时将collection_method设为charge_automatically,收紧默认的支付校验规则 - 监听
customer.subscription.createdwebhook事件,给每一个新创建的试用订阅设置15分钟的延迟校验任务:如果校验时发现订阅关联的客户名下没有绑定有效默认支付方式,直接调用接口删除这条trialing状态的无效订阅即可
注意:该方案会存在最长15分钟的短时间无效试用记录,数据一致性不如方案1
避坑提醒
- 不要依赖Stripe的账单规则、试用到期规则做拦截,只要订阅创建时没有强制绑定有效支付方式,就一定会先生成
trialing状态的记录 - 不要以前端返回的「用户已填完银行卡」作为创建订阅的依据,前端状态可被篡改,必须以Stripe服务端webhook推送的支付方式绑定成功事件为准
- 如果使用Stripe Checkout托管支付页,可以在创建Session时将
subscription_data.trial_settings.end_behavior.missing_payment_method设为cancel,实现试用到期前未绑卡自动取消订阅,但该配置无法解决试用期初期无卡仍显示trialing的问题,后移订阅创建时机才是根本解法
内容的提问来源于stack exchange,提问作者Kavin404
相关产品推荐
相关产品推荐

