You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stripe使用已存卡片token创建带3D Secure校验的支付失败如何解决

问题核心错误点

1. 支付API选型不支持3D Secure

你当前使用的stripe.charges.create是Stripe旧版Charges API,原生不满足SCA合规要求,无法自动处理3D Secure认证流程,遇到需要额外认证的卡片必然抛出authentication_required错误,这是核心根源问题。目前Stripe官方已全面推荐使用Payment Intent API替代Charges API实现支付流程。

2. 前端confirmPayment参数配置完全不符合规范

你写的前端认证代码存在多个硬伤:

  • 传值错误:type字段应为小写的'card',setupFutureUsage枚举值为小写的'off_session',大小写敏感传错直接失效
  • 无效字段:Stripe官方confirmPayment接口不存在cardDetails参数,你保存的卡片ID(格式为card_xxx或pm_xxx)应该赋值给payment_method字段,而不是传无效的payment_method:'creditCard'枚举值
  • 冗余配置:不需要强制指定request_three_d_secure: "any",Stripe会根据卡组织要求自动触发3D Secure认证,强制配置反而可能给不需要认证的卡片增加额外流程

正确实现流程

第一步:后端替换为Payment Intent创建逻辑

将你之前创建Charge的代码替换为如下逻辑:

const paymentIntent = await stripe.paymentIntents.create({
  amount,
  currency: 'eur',
  customer: user.stripeCustomerId,
  payment_method: cardId, // 你已保存的用户关联卡片ID
  confirm: true, // 创建时直接尝试确认支付
  off_session: false, // 用户在场操作传false,后续离线自动扣款传true
  description: `userId: ${user._id}`,
  return_url: '你前端支付完成后跳转的页面地址'
});

接口创建完成后将paymentIntent.client_secret返回给前端,同时判断paymentIntent.status:如果返回requires_action则说明需要触发3D Secure认证,交给前端处理即可。

第二步:前端修正认证调用逻辑

如果是使用Stripe官方JS SDK搭配Elements组件,直接调用confirmCardPayment接口即可自动弹出3D Secure认证弹窗:

const { paymentIntent, error } = await stripe.confirmCardPayment(clientSecret, {
  payment_method: cardId // 你保存的用户卡片ID
});

调用后判断:如果error为空且paymentIntent.status为succeeded,则支付完成。


内容的提问来源于stack exchange,提问作者Andrea Colombo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:57:03