jjzjj

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

coder 2024-04-18 原文

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

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

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

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

"Your card was declined. This transaction requires authentication. Please check your card details and try again."

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

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

最佳答案

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

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

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

返回您的 PaymentIntent 响应后,您将拥有一个 client_secret key (此处文档: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",
  ...
}

在你的服务器端你必须保存这个对象。 您现在可以使用先前的 client_secret key (此处文档: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();
        }
    });
});

如果一切顺利,当您单击提交按钮时,您将看到一个测试 3D 安全弹出窗口,其中包含“成功”或“未通过”安全测试的选项。如果您点击成功按钮,您的表单将被提交,您必须等待 webhook“charged.success”来确认交易。

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

在我的例子中,一旦提交了表单,我就会显示一个加载器并每秒检查一次 ajax 调用,看看我的支付意向状态是否发生了变化(通过 webhook)。对于您的测试环境,您可以使用 http://requestbin.net和 postman 。

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

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

关于javascript - 我怎么知道 3D Secure 2 身份验证在升级到 stripe.js 版本 3 后有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56760146/

有关javascript - 我怎么知道 3D Secure 2 身份验证在升级到 stripe.js 版本 3 后有效的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  10. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

随机推荐