Stripe 14天免费试用期内添加卡片后支付状态显示‘Incomplete’及自动扣费实现咨询
首先,我完全理解你的困惑——设置了14天试用期让用户后期自由加卡,结果加卡后支付状态显示“Incomplete”,还担心试用期后没法自动扣费,这确实挺闹心的。我来帮你拆解问题根源和具体解决办法:
为什么会出现“Incomplete”状态?
你当前的代码里配置了card: { request_three_d_secure: "automatic" },这个设置的作用是当系统判断需要3D Secure验证时自动触发流程。但这里的核心矛盾是:当用户在试用期内添加卡片时,Stripe会尝试确认支付方法的有效性,但因为订阅还处于试用期(没有立即发起实际扣费),3D Secure的验证流程没有完整走完——毕竟3DS需要用户实时交互完成验证,而此时没有实际的扣费请求来驱动这个流程闭环,所以就会留下“3D Secure attempt incomplete”的提示,最终标记支付状态为Incomplete。
简单说就是:加卡环节只完成了卡片关联,却没走完必要的3DS验证,Stripe认为这个支付方法还没完全“就绪”,所以状态异常。
如何解决并确保试用期后自动扣费?
我给你几个针对性的调整方案,结合你的现有代码来优化:
1. 调整3D Secure的触发时机配置
首先修改Checkout Session的创建代码,把3DS验证的触发时机从“自动”改成“仅在必要时(即实际扣费请求时)”,同时完善订阅的支付行为配置:
const session = await stripe().checkout.sessions.create({ mode: "subscription", payment_method_collection: "if_required", subscription_data: { trial_period_days: 14, // 允许订阅在支付方法未完全确认时保持有效,后期自动重试 payment_behavior: "default_incomplete", payment_settings: { // 保存添加的卡片为订阅默认支付方式 save_default_payment_method: "on_subscription", payment_method_options: { card: { // 只在实际扣费(比如试用期结束时)触发3DS验证 request_three_d_secure: "when_required" } } } }, // 其他代码逻辑... });
2. 处理用户添加卡片后的支付方法确认
当用户在试用期内通过Stripe Elements或客户门户添加卡片后,你需要在后端手动触发支付方法的确认流程,确保3DS验证在这个环节完成,而不是等到扣费的时候:
// 用户添加卡片后的后端处理逻辑 const setupIntent = await stripe().setupIntents.create({ customer: "用户对应的Stripe Customer ID", payment_method: "新添加的支付方法ID", confirm: true, payment_method_options: { card: { request_three_d_secure: "automatic" } } });
这个操作会直接触发3DS验证流程,用户完成验证后,该支付方法会被Stripe标记为“已确认可用”,不会再出现Incomplete的状态。
3. 确保订阅的自动重试机制正常
另外,你需要在Stripe后台确认两个关键配置:
- 开启订阅自动重试功能:这样如果试用期结束后第一次扣费失败(比如卡片余额不足),Stripe会按照你设置的规则自动重试扣费
- 检查支付失败通知设置:可以配置自动给用户发邮件提醒,让用户及时更新支付信息
关键注意事项
- 一定要在试用期内完成支付方法的完整验证(包括3DS),否则试用期后Stripe发起扣费请求时,可能因支付方法未验证而直接失败
- 可以监听Stripe的
customer.subscription.updated和invoice.payment_failed这两个webhook事件,及时捕获支付异常,比如给用户推送站内信提醒他们重新验证卡片 - 如果还是有问题,去Stripe后台的Events页面查看具体的支付日志,里面会有更详细的错误原因,能帮你快速定位问题
按照这些步骤调整后,用户在试用期内添加卡片并完成3DS验证后,状态就会恢复正常,试用期结束当天Stripe也会自动发起扣费,完全符合你的预期。




