Stripe Intent API 保留卡然后充电不起作用

roy*_*rma 5 android node.js stripe-payments

我正在尝试为我的产品实现一个非常简单的流程:

  1. 客户将卡添加到他的帐户

  2. 客户提出请求 -> 为请求价格在他的卡上创建一个保留

  3. 根据请求交付 -> 执行卡上的初始保留

在阅读有关 Stripe 的新 Intent API 的大量文档后,这看起来非常简单。

A. 创建一个 Stripe 客户

stripe.customers.create({ email: user.email, description:${user.email} 的客户});

B. 给客户贴一张卡(支付方式),setup intent用这张卡创建一个授权未来的费用

stripe.setupIntents.create({ 'customer': customer_id, 'payment_method': paymentMethodId });

C.根据客户的请求,创建paymentIntent,capture_method设置为manual

const paymentIntent = await stripe.paymentIntents.create({
    'amount': price * 100, //convert shekels to agorot
    'currency': 'ILS',
    'customer': customer_id,
    'payment_method': payment_method,
    'payment_method_types': ['card'],
    'capture_method': 'manual'
});
Run Code Online (Sandbox Code Playgroud)

D. 根据要求交付,只需在步骤 C 中创建capture的原始文件paymentIntent

const captureHoldIntent = await stripe.paymentIntents.capture(paymentIntentId);

我实际遇到的问题发生在步骤 C 和 D 之间:

无法为 user_id KAJSD92 错误保存交易错误:无法捕获此 PaymentIntent,因为它的状态为 requires_confirmation。只能捕获具有以下状态之一的 PaymentIntent:requires_capture。

虽然我理解此错误消息,但我的困惑是为什么paymentIntent步骤 C 中的created 不会更改为requires_capture状态,而是 always require_confirmation,即使它已经被确认?

roy*_*rma 8

缺失的部分是调用paymentIntents.confirm以“确认”该服务实际上想要保留该卡。之后,意图状态更改为requires_capture允许我调用该capture方法。

  1. 创建
const paymentIntent = await stripe.paymentIntents.create({
            'amount': price * 100, //convert shekels to agorot
            'currency': 'ILS',
            'customer': customer_id,
            'payment_method': payment_method,
            'payment_method_types': ['card'],
            'capture_method': 'manual'
        });
Run Code Online (Sandbox Code Playgroud)
  1. 确认

const confirmPaymentIntent = await stripe.paymentIntents.confirm(intentId);

  1. 捕获

const captureHoldIntent = await stripe.paymentIntents.capture(intentId);

  • 您还可以在创建付款意向时将“confirm”选项添加为“true”。第 2 步变得毫无用处。更多信息:https://stripe.com/docs/api/ payment_intents/create#create_ payment_intent-confirm (5认同)
  • 添加@Sebj 答案:您可以通过使用 `'confirm': true` 跳过步骤 2,并通过删除 `'capture_method': 'manual'` 跳过步骤 3。Stripe 将默认为“capture_method”:“automatic”,从而立即捕获付款意图。 (2认同)