我有与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。