我有与Stripe集成的Spring Boot / Angular应用程序。

我们正在尝试将3d安全授权添加到我们的现有系统中。具有即时自动和手动确认功能的基本流程很容易实现,并且很吸引人,但是...

在特定情况下,我们拥有多种服务,其中一些服务即刻收费(已捕获),其中一些需要由提供商确认,
并在确认后捕获。在当前的实现中,我们将创建单独的费用
对于每个异步服务(需要确认的服务),并在确认成功的情况下捕获费用。因此,我们只有一个用户操作,但有多个捕获。

现在,我们正在尝试对PaymentIntent进行同样的操作,但是看起来PaymentIntent只能收取一次费用,并且无法部分确认。此外,如果我们创建多个PaymentIntent,即使使用相同的paymentMethodId,
看来我们需要为每个用户单独执行操作。

有什么方法可以通过一次用户操作来支持多种费用或多种PaymentIntent,从而避免为每个异步捕获进行3d安全验证?

更新1:
我设法使用SetupIntent来实现此目的,但仅用于允许您进行一次性验证的卡,以后可以将其用于其他付款:

 @PostMapping("/createSetup")
    public String createPaymentSetup(HttpServletRequest request) throws Exception {
        Map<String, Object> params = new HashMap<>();
        SetupIntent setupIntent = SetupIntent.create(params);
        return setupIntent.getClientSecret();
    }


该客户机密将在最前面用于调用3d验证(仍然无需任何实际付款):

this.stripe.handleCardSetup(
            this.clientSecret, this.cardElement, {
              payment_method_data: {
                billing_details: {name: this.cardholderName.value}
              }
            }
          ).then((result) =>  {
            if (result.error) {
              console.log(result.error);
            } else {
                console.log(result);
                console.log("Setup Intent id: " + result.setupIntent.id);
              this.saveCardForFutureUse(result.setupIntent.id);
            }
          });
        });


在saveCardForFutureUse中,我回叫以将此设置的付款方式与客户联系起来:

String setupIntentId = request.getHeader("paymentId");
        SetupIntent intent = SetupIntent.retrieve(setupIntentId);
        PaymentMethod paymentMethod = PaymentMethod.retrieve(intent.getPaymentMethod());
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("customer", "{CUSTOMER_ID}");
        paymentMethod.attach(params);


然后,我们可以使用给定的paymentMethod创建几个PaymentIntent:

PaymentIntentCreateParams bid1Params = PaymentIntentCreateParams.builder()
                .setAmount(3099l)
                .setCurrency("usd")
                .setConfirm(true)
                .setPaymentMethod(paymentMethod.getId())
                .setCustomer("CUSTOMER_ID")
                .setOffSession(true)
                .build();



        PaymentIntentCreateParams bid2Params = PaymentIntentCreateParams.builder()
                .setAmount(5099l)
                .setCurrency("usd")
                .setConfirm(true)
                .setPaymentMethod(paymentMethod.getId())
                .setCustomer("CUSTOMER_ID")
                .setOffSession(true)
                .build();
        PaymentIntent bid1 = PaymentIntent.create(bid1Params);
        PaymentIntent bid2 = PaymentIntent.create(bid2Params);


如果我们使用正确的卡,例如:


  4000002500003155设置或首次交易时需要


这2个竞标付款意向将被确认...
如果我们使用像这样的卡片:


  4000002760003184必需此测试卡要求在
  所有交易。


他们仍然会处于状态


  “ requires_action”


因此,对于那些卡,我似乎需要为每笔付款使用此3d ...

最佳答案

PaymentIntent实际上确实支持授权和捕获,就像之前的Charge API一样:https://stripe.com/docs/api/payment_intents/create#create_payment_intent-capture_method

根据您的描述,一种解决方法是创建1个PaymentIntent,并授权您支付最高费用。然后,一旦您与提供者进行了交流,并获得了要捕获的最终值的总和,就可以捕获到该值的PaymentIntent。

或者,您可以按以下说明重用第一个PaymentIntent(或SetupIntents)中的卡详细信息,以供以后使用:https://stripe.com/docs/payments/cards/reusing-cards#saving-cards-after-payment

10-05 23:19