Javascript Braintree付款赢得';不能使用AJAX提交

Javascript Braintree付款赢得';不能使用AJAX提交,javascript,php,jquery,ajax,braintree,Javascript,Php,Jquery,Ajax,Braintree,我有一个动态AJAX提交。我正在尝试使用AJAX将Braintree(PayPal)支付数据提交到payment.php。不幸的是,Braintree给了我一个暂时的错误。Braintree在提交时使用代码(nonce)创建输入,但我的提交是在创建代码之前提交的 Braintree给了我一个创建代码的脚本 <script src="https://js.braintreegateway.com/v2/braintree.js"></script> submit(this

我有一个动态AJAX提交。我正在尝试使用AJAX将Braintree(PayPal)支付数据提交到payment.php。不幸的是,Braintree给了我一个暂时的错误。Braintree在提交时使用代码(nonce)创建输入,但我的提交是在创建代码之前提交的

Braintree给了我一个创建代码的脚本

<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
submit(this)调用ajax。我试图推迟提交,但没有任何效果。例如如果我在提交过程中调用alert(),则会添加代码,提交工作正常;除了现在我有一个警报。问题是两个代码同时运行,而Braintree代码反应太慢。我还试图重新定位JS代码上方和下方的链接,但运气不佳。

如前所述,我认为您应该使用从BrainTree的GlobalSetup收到的
onPaymentMethodReceived
回调。您可以在如下设置中配置此回调,而不是使用jQuery自己处理表单提交

    braintree.setup("CLIENT-TOKEN-FROM-SERVER", "dropin", {
      container: "dropin-container",
      onPaymentMethodReceived: function (paymentMethod) {
        // Do some logic in here.
        // When you're ready to submit the form:
        myForm.submit();
      }
   });
当Drop-in(作为表单提交的结果)生成了一个
paymentmethod\u nonce
时,调用
onPaymentMethodReceived
。将使用
paymentMethod
对象调用它,该对象将nonce作为字符串包含

您可以找到有关传递给
onPaymentMethodReceived
回调的
paymentMethod
对象的更多详细信息,它有一个名为
nonce
的属性


希望这能有所帮助:)

我的解决方案是防止AJAX在收到之前提交。希望这有帮助

braintree.setup('TOKEN-HERE', "dropin", {
  container: "payment-form",
  onPaymentMethodReceived: (obj) ->
    $('form#checkout input#payment_method_nonce').val(obj['nonce'])
    frm = $('form#checkout')
    $.ajax
      type: frm.attr('method')
      url: frm.attr('action')
      data: frm.serialize()
})

$(document).on 'ajax:before', 'form#checkout', ->
  return false unless $('form#checkout input#payment_method_nonce').val()

我也想这么做,我就是这么做的

  • 首先创建dropin并处理所有创建错误,直到第8行
  • 然后防止默认提交事件立即获取付款方法

  • 最后使用此方法>>requestPaymentMethod()您好,请不要使用JS提交支付网关,它将很容易被破解,而不是使用PHP Braintree库。如何在不重新加载页面的情况下获得验证错误?还是必须重新加载,没办法绕过它?@Mitul。。但是PHP是服务器端脚本,在我们的浏览器中不起作用。如果我们在提交表单之前要做一些处理,那么JS是唯一的方式:)你可以在自己的服务器上调用ajax,然后在客户端调用braintree支付方法b。关键是可以看到我在理解你的方法时遇到了一些困难。Ajax是用JS完成的,对吗?如果你看一下流程,我们的JS客户端将从我们的服务器获得一个令牌,该令牌将用于BrainTree服务器的身份验证,从BrainTree服务器获得一个nonce,将该nonce发送到我们的服务器,然后服务器将再次使用BrainTree服务器验证该令牌。谢谢,但我尝试了这一点。OnPaymentMethodReceived仅在提交时收到。因此,您可以阻止任何其他提交。提交->创建临时->不再提交A这就是我们想要做的,对吗<代码>onPaymentMethodReceived将在表单提交时调用。生成nonce后,您可以使用传递到此回调的对象获取对该对象的引用,然后您将手动触发表单提交,如上面的示例代码所示。您是否只需发送nonce即可获取所有错误?nonce是否也包含错误信息?也许这就是我所误解的,我建议你去了解它是如何工作的。您没有从JS文件向BrainTree服务器发送nonce,而是向BrainTree服务器发送令牌以验证支付方法,如果它是有效的方法,BrainTree服务器将以
    nonce
    响应。然后,您将该nonce和其他付款详细信息发送到您自己的PHP/Java服务器,该服务器将创建一个新的交易,并将其发送到BrainTree服务器,该服务器将处理付款。非常感谢。现在我明白了。我认为整个表单需要提交才能得到错误,但实际上我只需要生成nonce。非常感谢。
    braintree.setup('TOKEN-HERE', "dropin", {
      container: "payment-form",
      onPaymentMethodReceived: (obj) ->
        $('form#checkout input#payment_method_nonce').val(obj['nonce'])
        frm = $('form#checkout')
        $.ajax
          type: frm.attr('method')
          url: frm.attr('action')
          data: frm.serialize()
    })
    
    $(document).on 'ajax:before', 'form#checkout', ->
      return false unless $('form#checkout input#payment_method_nonce').val()