Stripe 3DS2 - 付款尝试失败,因为需要执行其他操作才能完成

问题描述 投票:0回答:1

我的 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
        );

    }
php stripe-payments laravel-cashier
1个回答
0
投票

如果我理解你的代码,你正在这样做:
1 - 创建付款意向(服务器)
2 - 使用

client_secret
(客户端)
创建支付元素 3 - 使用
createPaymentMethod
(客户)
创建付款方式 4 - 使用付款方式 ID 确认付款意图(服务器)

您遇到的问题是预料之中的。

createPaymentMethod
不验证该卡。当您尝试从服务器确认时,身份验证尚未执行。

最简单的解决方案是用客户端

confirmPayment
函数替换 3 和 4,并依靠 webhooks / API 轮询来检查您的付款意图的状态。这是官方集成:
https://docs.stripe.com/ payments/accept-a- payment?platform=web&ui=elements

如果您需要完成支付服务器端,您可以选择执行此操作,但它们是“替代”,因为在处理身份验证时它并不是最佳选择:
https://docs.stripe.com/ payments/finalize- payments-on-the-server

© www.soinside.com 2019 - 2024. All rights reserved.