使用 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.confirmCardSetup
和 clientSecret
和 card
元素,然后将付款方式发送到我的后端。
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 支付意图仍然不完整的主要内容,如果未能解决你的问题,请参考以下文章