存储信用卡以供未来付款时,如何使用Stripe 3D Secure?

7
是否可以在保存卡片用于未来付款时使用3D Secure?
根据Stripe文档中的https://stripe.com/docs/sources/three-d-secure,似乎是可以这样做的。
但是根据文档,不再建议使用这种方式,而是应该使用PaymentIntents:
“不再推荐使用此API。如果您希望使用3D Secure,我们强烈建议您采用PaymentIntents,我们的新支付API。”
那么,是否有一种方法可以使用PaymentIntents(利用3D安全)仅保存卡片而不立即进行付款?

我不确定你的问题是否有意义。Payment Intent明确是收款的尝试,而3D Secure仅在您进行付款时发生。如果您只是保存卡片而没有进行付款,则应使用stripe.js的stripe.createSource创建源,就像您链接中的第1步一样,并将其保存到客户对象。然后,如果您想要收取卡片费用,可以创建一个Payment Intent。https://stripe.com/docs/payments/payment-intents/usage#using-a-saved-source - karllekko
我们的使用案例是希望保存客户的信用卡以便未来的收费,并且这些未来的收费将在我们服务器的后台自动完成,因此我们无法在未来的时间从客户那里获取3D安全信息。因此,我们希望在保存卡时利用3D安全认证。我已经向Stripe支持团队咨询了此事,他们表示目前不支持在没有进行付款的情况下保存卡的3D安全认证。 - len
1
嗨@len,我正在尝试实现相同的事情,你是否找到了使用付款意图完成此操作的方法? - nmeylan
4个回答

5

只是告诉你,我已经联系了Stripe支持,因为我也遇到了和你一样的问题,这里是答案:

[...] PaymentIntents目前不支持在不随后创建收费的情况下创建来源。很遗憾,在当前保存信用卡的方法中无法集成3DSecure。

PaymentIntents是一个相当新的Stripe产品,我们仍在解决问题并决定我们将支持哪些功能。保存来源绝对是我们优先考虑的事项,未来会有更多关于此更新的信息。

我试图获得有关他们路线图的更多信息,以了解该功能是否会在9月发布,但是支持无法为我提供信息。

编辑: stripe已经改进了其文档,并现在解释了如何实现您想要的同时尊重SCA https://stripe.com/docs/payments/cards/saving-cards#saving-card-without-paymenthttps://stripe.com/docs/payments/cards/charging-saved-cards


请看这里的其他答案。我也在尝试弄清楚同样的事情... :/ - BjornW

2

保存信用卡以便未来付款时是否可以使用3D Secure?

我使用PaymentIntents创建客户并进行付款:

最初的回答:

customer = stripe.Customer.create(

payment = stripe.PaymentIntent.create(customer=customer_id, ....

在支付中,您有卡片类型payment['charges']['data'][0]['payment_method_details']['card']['brand']和卡片的最后4位数字payment['charges']['data'][0]['payment_method_details']['card']['last4']
您可以在本地存储customer_id、卡片类型和最后4位数,以便下次向该客户显示。 要进行另一笔付款,您只需要使用stripe.PaymentIntent.create()和您第一次保存的customer.id。 如果客户要使用另一张卡片,只需执行
customer = stripe.Customer.modify(
                customer_id,
                source=token_id
           )

token_id comes from stripe.js in your frontend


据我所了解,这个答案与刚刚收到 Stripe 支持团队的回复相矛盾 :) 逻辑上讲,您应该能够将卡片的“元数据”与客户一起存储,然后稍后可以从中创建 PaymentIntent,只有在此时才会触发 3D-Secure 2.0 步骤。但它真的有效吗? :) - BjornW
1
我认为你没有理解使用情况:作者(以及所有涉及此主题的人)想要实现的是:一天内保存启用了3D安全功能的客户卡,然后再收取费用。这是当您想要构建自定义订阅系统并且提供的订阅系统不符合您的需求时的情况。 目前似乎PaymentIntents不支持此用例。 我们都知道,您可以创建一个PaymentIntents,该PaymentIntents将“立即”收取卡费,并保存此卡以进行其他后续付款。 - nmeylan
当您创建客户时,您将从stripe.js发送一个token_id,该token_id在用户输入卡号后发送,因此您在Stripe中创建的客户具有卡片信息。之后,您就拥有了客户的ID,因此您可以使用所需的付款来创建PaymentIntent。对于我而言,这在测试模式下运行良好,唯一的问题是当需要3DSecure时,我现在无法从iframe接收消息,但支付显示在stripe仪表板中 :) - Paco Bernal
我不确定作者是在谈论将卡片本地保存还是在Stripe中保存。我认为在应用程序刚开始时,卡片是本地保存的,但是从一段时间以来,我们不再保存也不想本地保存卡片。我认为支持团队的回答是在谈论本地保存卡片,PaymentIntents旨在不在本地保存卡片,而是在他们的系统上保存。 - Paco Bernal

1
使用SetupIntent API,它基本上是一个具有空金额的PaymentIntent(相同的工作流程)。

0
在创建付款意向时,设置setup_future_usage='off_session'
stripe.PaymentIntent.create(
  amount=1099,
  currency='usd',
  setup_future_usage='off_session',
)

这些条纹文档展示了如何以一种方式保存卡片,使得将来使用3D Secure的卡片可以进行“离线”支付。

https://stripe.com/docs/payments/payment-intents#future-usage

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接