Stripe 3D 安全授权弹出窗口缺失

Raf*_*fiq 5 php stripe-payments stripe-sca

这是我的 HTML 表单,并使用 stripe 最新的 PaymentIntent API。我的问题是我没有弹出 3D 安全授权。谁能帮助我指导那些让我出错的事情?我试图遵循条纹文档(https://stripe.com/docs/ payments/ payment-intents/web#handling-next-actions),但它完全令人困惑。

\n\n
<script src=\'https://js.stripe.com/v3/\' type=\'text/javascript\'></script>\n<form action="process_payment.php" method="post" id="payment-form">\n    <div class="form-row">\n        <label for="card-element">\n            Credit or debit card\n        </label>\n        <div id="card-element"><!-- Your form goes here --></div>\n    </div>\n    <!-- Used to display form errors -->\n    <div id="card-errors" role="alert"></div>\n    <button class="atbdp_pay_btn" type="submit">Pay</button>\n</form>\n
Run Code Online (Sandbox Code Playgroud)\n\n

JavaScript

\n\n
document.addEventListener("DOMContentLoaded", function(event) {\n        var stripe = Stripe(\'pk_test_xxxxxxxxxx\'); // test publishable API key\n        var elements = stripe.elements();\n\n        var card = elements.create(\'card\');\n        // Add an instance of the card UI component into the `card-element` <div>\n        card.mount(\'#card-element\');\n\n        // Handle events and errors\n        card.addEventListener(\'change\', function(event) {\n            var displayError = document.getElementById(\'card-errors\');\n            if (event.error) {\n                displayError.textContent = event.error.message;\n            } else {\n                displayError.textContent = \'\';\n            }\n        });\n\n        function stripeTokenHandler(token) {\n            // Insert the token ID into the form so it gets submitted to the server\n            var form = document.getElementById(\'payment-form\');\n            var hiddenInput = document.createElement(\'input\');\n            hiddenInput.setAttribute(\'type\', \'hidden\');\n            hiddenInput.setAttribute(\'name\', \'stripeToken\');\n            hiddenInput.setAttribute(\'value\', token.id);\n            form.appendChild(hiddenInput);\n\n            // Submit the form\n            form.submit();\n        }\n\n        function createToken() {\n            stripe.createToken(card).then(function(result) {\n                if (result.error) {\n                    // Inform the user if there was an error\n                    var errorElement = document.getElementById(\'card-errors\');\n                    errorElement.textContent = result.error.message;\n                } else {\n                    // Send the token to your server\n                    stripeTokenHandler(result.token);\n                }\n            });\n        };\n\n        // Create a token when the form is submitted.\n        var form = document.getElementById(\'payment-form\');\n        form.addEventListener(\'submit\', function(e) {\n            e.preventDefault();\n            createToken();\n        });\n\n    });\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后处理响应

\n\n
require_once \'init.php\';\n\\Stripe\\Stripe::setApiKey( \'sk_test_xxxxxxxx\' );\n$stripeToken = $_POST[\'stripeToken\']; // stripe will handle the sanitization\n$error_msg = \'\';\ntry {\n    $intent = \\Stripe\\PaymentIntent::create([\n        \'payment_method_data\' => [\n            \'type\' => \'card\',\n            \'card\' => [\'token\' => $stripeToken],\n        ],\n        \'amount\' => 19 * 100,\n        \'currency\' => \'usd\',\n        \'confirmation_method\' => \'manual\',\n        \'confirm\' => true,\n    ]);\n    $result = generatePaymentResponse($intent);\n}catch (\\Stripe\\Card $exception){\n\n}\n\nfunction generatePaymentResponse($intent) {\n    if ($intent->status == \'requires_source_action\' &&\n        $intent->next_action->type == \'use_stripe_sdk\') {\n        # Tell the client to handle the action\n        echo json_encode([\n            \'requires_action\' => true,\n            \'payment_intent_client_secret\' => $intent->client_secret\n        ]);\n    } else if ($intent->status == \'succeeded\') {\n        # The payment didn\xe2\x80\x99t need any additional actions and completed!\n        # Handle post-payment fulfillment\n        echo json_encode([\n            \'success\' => true\n        ]);\n    } else {\n        # Invalid status\n        http_response_code(500);\n        echo json_encode([\'error\' => \'Invalid PaymentIntent status\']);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

响应是

\n\n
"requires_action": true,\n  "payment_intent_client_secret": "pi_1FIowAIUv6RpAcZVcd9txP1g_secret_M0byttxAd4ZFB4NxLgsanaZZS"\n
Run Code Online (Sandbox Code Playgroud)\n

Nir*_*evy 4

您正在使用的stripe.createToken不支持 3ds 身份验证。
您需要将客户端代码迁移到stripe.createPaymentMethod支持它的地方。

stripe 文档中有一个有用的迁移指南,您可以在此处遵循