我怎么知道升级到 stripe.js 版本 3 后 3D Secure 2 身份验证有效

lom*_*kev 6 javascript php stripe-payments

我更新了一个站点,因此它使用最新的 stripe-php (6.39.0),现在加载了 stripe.js 版本 3。我对代码进行了所有必要的更改,以便我的信用卡字段现在使用 Stripe Elements 显示. 测试交易有效,我已经更新了实时网站,实际付款除外。

我进行此更新的原因是 Stripe 告知我需要升级站点,以便其 Stripe 集成能够与欧盟在 2019 年 9 月之前要求的强客户身份验证 (SCA) 配合使用。

Stripe 有不同的信用卡测试号码,您可以用来测试处理付款时出现的问题。这个数字可以在这里找到:https : //stripe.com/docs/testing#cards

4000000000003220 模拟必须完成 3D Secure 2 身份验证的交易。但是,当我使用此代码条带拒绝支付并返回消息时:

“您的卡被拒绝。此交易需要身份验证。请检查您的卡详细信息,然后重试。”

这是否意味着 3D Secure 2 有效?

在现实世界中,它会打开一个窗口,其中包含来自客户发卡机构的界面。所以我不确定我的集成是否有效。如前所述,付款被排除在外,但我需要在 9 月份需要强客户身份验证时做好准备。

ArG*_*rGh 6

看来您在 JS 部分存在集成问题。对于简单的收费(以下示例不适用于订阅),这是您必须实施的方式:

首先,您必须创建付款意图(此处的文档:https : //stripe.com/docs/api/payment_intents/create):

\Stripe\PaymentIntent::create([
  "amount" => 2000,
  "currency" => "usd",
  "payment_method_types" => ["card"],
]);
Run Code Online (Sandbox Code Playgroud)

返回 PaymentIntent 响应后,您将拥有一个 client_secret 密钥(此处的文档:https ://stripe.com/docs/api/payment_intents/object )。可以看到你的付款状态是“requires_payment_method”

{
  "id": "pi_1Dasb62eZvKYlo2CPsLtD0kn",
  "object": "payment_intent",
  "amount": 1000,
  "amount_capturable": 0,
  "amount_received": 0,
  ...
  "client_secret": "pi_1Dasb62eZvKYlo2CPsLtD0kn_secret_6aR6iII8CYaFCrwygLBnJW8js",
  ...
  "status": "requires_payment_method",
  ...
}
Run Code Online (Sandbox Code Playgroud)

在您的服务器端,您必须保存此对象。您现在可以使用先前的 client_secret 键(此处的文档:https : //stripe.com/docs/payments/payment-intents/verifying-status)显示带有 JS 部分的付款表单。这个想法是你必须在点击提交按钮时调用 Js 函数,但不要提交!等待响应提交。使用一些 jquery 这应该是这样的:

var $mySubmitButton = $('#my-submit-button'),
    $myPaymentForm = $('#my-payment-form'),
    clientSecret = $cardButton.data('client-secret'); // put your client-secret somewhere

$mySubmitButton.on('click', function(e) {
  
    e.preventDefault();

    // Disable button to disallow multiple click
    $(this).attr("disabled", true);

    stripe.handleCardPayment(
        clientSecret,
        {
            payment_method: clientMethod, // if you have a clientMethod
        }
    ).then(function(result) {
        if (result.error) {
            // show error message
            // then enable button
            $mySubmitButton.attr("disabled", false);
        } else {
            // Submit form
            $myPaymentForm.submit();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

如果一切顺利,当您单击提交按钮时,您将获得一个测试 3D 安全弹出窗口,其中包含“成功”或“失败”安全测试的选项。如果您点击成功按钮,您的表单将被提交,您必须等待网络钩子“charged.success”来确认交易。

收到后,更改您的服务器对象状态并通知用户有关交易的信息。

就我而言,一旦表单提交,我就会显示一个加载程序并每秒检查一次 ajax 调用,以查看我的付款意图状态是否已更改(通过 webhook)。对于您的测试环境,您可以使用http://requestbin.net和 Postman。

请注意:此页面上引用的某些卡将无法正常工作(您无法添加它们)https://stripe.com/docs/testing#cards(3D安全测试卡号和令牌部分)。得到了他们的支持。

如果您使用保存的卡,则只能使用这些卡进行测试:https : //stripe.com/docs/payments/cards/charging-saved-cards#testing