如何处理Stripe中需3D Secure验证的订阅定期付款问题?
Stripe订阅3DS验证问题解答
1. 能否保存3DS信息供后续订阅的Payment Intent复用?
当然可以,核心逻辑是3DS验证结果会和用户的支付方式(PaymentMethod)绑定,只要满足以下要求:
- 必须在**用户在场(on_session)**的场景下完成3DS验证——比如用户首次添加支付方式、第一次付款时触发验证并完成。验证通过后,这个PaymentMethod会被标记为已通过身份验证。
- 后续用这个已验证的PaymentMethod创建off_session订阅,或者处理订阅续费的Payment Intent时,只要没有新增的风险触发因素,Stripe会自动复用之前的3DS验证结果,不用再让用户验证一次。
- 要是已经有
incomplete或past_due状态的订阅,得先引导用户完成3DS验证(处理状态为requires_action的Payment Intent),搞定之后后续的续费就会自动复用验证信息了。
2. 配置了Radar规则触发所有支持3DS的卡验证,但添加卡时没触发,为啥?
大概率是这几个原因:
- 添加卡的流程没触发验证触发条件:Radar的3DS规则只作用于Payment Intent或Setup Intent。如果只是单纯把卡绑定到用户账户(比如只调用
paymentMethods.attach),没走Setup Intent或Payment Intent的确认流程,Stripe不会触发3DS验证。得在添加卡时通过Setup Intent完成确认环节,确保流程覆盖验证要求。 - off_session创建订阅导致无法实时触发验证:你现在用
off_session: true创建订阅,要是某个订阅需要3DS验证,Stripe会返回requires_action状态,但因为是off_session场景,没法引导用户完成验证,直接就导致订阅状态异常了。正确的流程应该是先在用户在场的on_session场景下完成支付方式的3DS验证,再创建off_session订阅。 - Radar规则没覆盖当前场景:去检查下你的Radar规则,确认是否包含了Setup Intent(添加卡时常用的流程)的触发场景,还有规则里的其他条件(比如金额、地区)是不是都覆盖了你的使用场景。
- 发卡行的限制:有些卡虽然支持3DS,但在Setup Intent场景下,发卡行可能不需要强制验证,这种情况Stripe会遵循发卡行的要求,不会触发3DS验证。
代码优化提示
你现在同时创建两个off_session订阅,很容易因为3DS验证问题导致订阅状态异常。建议调整流程:
- 先在用户在场的场景下,通过Setup Intent或首次付款完成支付方式的3DS验证。
- 把验证后的PaymentMethod设为用户的默认支付方式。
- 再执行你原来的代码创建两个off_session订阅,后续付款就会自动复用3DS验证信息了。
原代码:
const [planSubscription, overagesSubscription] = await Promise.all([ stripe.subscriptions.create({ customer: customer.id, off_session: true, items: [ { price: planConfig.main_plan_price, }, ], }), stripe.subscriptions.create({ customer: customer.id, off_session: true, items: [ { price: planConfig.events_overage_price, }, { price: planConfig.domains_overage_price, }, ], }), ]);
内容的提问来源于stack exchange,提问作者David Prifti
相关产品推荐
相关产品推荐

