我的 Stripe 3DS2 有问题。在大多数付款情况下,一切正常,客户可以发送询问。郑重声明一下,当时我们只保留他们的钱。以防万一我们接受他们的询问,我们就拿走他们的钱。我使用 paymentIntent 方法,因为这个应用程序在欧盟运行。
有时,客户会遇到错误:
“付款尝试失败,因为需要执行其他操作才能完成。”
并且无法发送询问。如果我理解得很好,3DS2 存在问题,在某些情况下要求客户在其银行应用程序中接受交易。
此刻我不知道该怎么办,因为: Stripe 3DS2 应自动请求银行授权 我认为没有必要在 Radar 中更改或设置某些规则。
我正在使用卡进行测试:4000002760003184
https://docs.stripe.com/testing#authentication-and-setup
3ds 的 Stripe 文档:https://docs.stripe.com/ payments/3d-secure/authentication-flow#controlling-when-to-present-the-3d-secure-flow
在客户端使用 JavaScript 获取客户端密钥:
const response = await axios.post(`/booking/${this.id}/payment-intent`);
const { clientSecret } = response.data;
const appearance = {
theme: 'stripe',
};
this.elements = stripe.elements({ appearance, clientSecret });
this.paymentElement = this.elements.create('payment', {
fields: {
billingDetails: {
address: {
country: 'never',
},
},
},
});
this.paymentElement.mount('#payment-element');
在服务器端创建支付意图:
public function createPaymentIntent(int $id): array
{
$bookingRequest = $this->bookingRequestSessionHandler->retrieve($id);
$amount = $bookingRequest->total()->getMinorAmount()->toInt();
$options = [
'capture_method' => 'manual',
];
$payment = (new Reservation())->pay($amount, $options);
return [
'clientSecret' => $payment->client_secret
];
}
将元素收集的支付信息转换为PaymentMethod并在服务器上处理。
const { paymentMethod, error } = await stripe.createPaymentMethod('card', this.paymentElement, {
billing_details: {
address: {
country: this.customerCountry,
},
},
});
if (error) {
// Display "error.message" to the user...
this.errorMessage = error.message;
return;
}
// The card has been verified successfully...
const data = {
paymentMethodId: paymentMethod.id,
};
axios
.post(`/booking/${this.id}/process`, data)
.then((response) => {
this.$emit('successBooking');
})
....
private function processPayment($paymentMethodId, $reservation): void
{
$options = [
'capture_method' => 'manual',
'receipt_email' => $reservation->customer_email
];
$payment = $reservation->charge(
$reservation->total,
$paymentMethodId,
$options
);
}
如果我理解你的代码,你正在这样做:
1 - 创建付款意向(服务器)
2 - 使用
client_secret
(客户端)createPaymentMethod
(客户)您遇到的问题是预料之中的。
createPaymentMethod
不验证该卡。当您尝试从服务器确认时,身份验证尚未执行。
最简单的解决方案是用客户端
confirmPayment
函数替换 3 和 4,并依靠 webhooks / API 轮询来检查您的付款意图的状态。这是官方集成:如果您需要完成支付服务器端,您可以选择执行此操作,但它们是“替代”,因为在处理身份验证时它并不是最佳选择:
https://docs.stripe.com/ payments/finalize- payments-on-the-server