使用 3D Secure 的 Stripe 支付意图仍然不完整

Posted

技术标签:

【中文标题】使用 3D Secure 的 Stripe 支付意图仍然不完整【英文标题】:Stripe payment intent remains incomplete with 3D Secure 【发布时间】:2021-05-11 12:21:39 【问题描述】:

我正在尝试在我的网络应用中实施 3D Secure。它与 SEPA 借记卡和不需要 3D Secure 的卡借记卡完美配合。但是,对于需要 3D Secure 的卡,付款在 Stripe 仪表板中仍处于 Incomplete 状态。

我的产品是年度订阅。

首先,我在服务器 (https://stripe.com/docs/api/payment_intents/create) 上创建支付意图,并在 HTTP 响应中发送客户端密码。

List<Object> paymentMethodTypes = new ArrayList<>();
paymentMethodTypes.add("card");
paymentMethodTypes.add("sepa_debit");
Map<String, Object> params = new HashMap<>();
params.put("amount", 2000);
params.put("currency", "eur");
params.put(
  "payment_method_types",
  paymentMethodTypes
);

PaymentIntent paymentIntent = PaymentIntent.create(params);

之后,我在前端使用 stripe.confirmCardSetupclientSecretcard 元素,然后将付款方式发送到我的后端。

const response = await stripe.confirmCardSetup(clientSecret, 
    payment_method: 
        card: elements.getElement(CardElement)
    
)

await setDefaultPaymentMethod(payload?.setupIntent?.payment_method);

然后我检索付款方式并将其附加给客户,最后创建订阅,如 Stripe 示例 (https://stripe.com/docs/billing/subscriptions/examples) 所示。

PaymentMethod paymentMethod = PaymentMethod.retrieve(
    "pm_***"
  );

Map<String, Object> params = new HashMap<>();
params.put(
  "customer",
  "clg_***"
);

PaymentMethod updatedPaymentMethod = paymentMethod.attach(params);


// Create subscription

它确实在前端显示 3D 安全身份验证模式。但是,在整个过程结束时(在后端创建订阅后),需要 3D Secure 的卡支付仍然处于Incomplete 状态。谁能指出我正确实施 3D Secure 的正确方向?

【问题讨论】:

【参考方案1】:

如果您在没有客户会话的情况下创建订阅,请记住在创建订阅时包含off_session: true

例子:

const subscription = await stripe.subscriptions.create(
    customer: customerId,
    off_session : true,
    items: [
         price: priceId , 
    ],
);

【讨论】:

【参考方案2】:

您使用哪种测试卡来测试您的集成?例如,4000 0027 6000 3184 卡将需要 3DS 确认,无论该卡之前是否使用 SetupIntent 设置。您可能想使用4000 0025 0000 3155 卡到test SetupIntents。

也就是说,这个场景中的SetupIntents通常只用于有试用期的订阅。这个想法是您现在对卡进行身份验证,以便以后可以在不需要 3DS 授权的情况下对其进行收费。如果您正在创建没有试用期的订阅,那么您应该在您的用户处于“会话状态”时create the subscription with the payment method and handle any 3DS actions if required。

【讨论】:

感谢您的回答。我正在使用您提到的卡(4000 0025 0000 3155)。问题是我想稍后收费,因为我正在处理客户端发送到服务器的一些数据,并且我只想在处理成功时向客户收费。实现这一目标的最佳方法是什么?

以上是关于使用 3D Secure 的 Stripe 支付意图仍然不完整的主要内容,如果未能解决你的问题,请参考以下文章

保存卡以备将来付款时使用 Stripe 3D Secure

如何在 PayPal 支付网关中集成 3D Secure 身份验证?

Stripe - 支付订单错误:无法向没有活动卡的客户收费

一些发卡行拒绝 3D Secure 请求[关闭]

使用 NextJS 更改 Stripe 支付的自动填充颜色

Stripe Connect:在Stripe Connect中,谁将支付Stripe费用,如何确定?