javascript - Braintree 集成 - 无法在服务器端代码中访问 javascript nonce

标签 javascript asp.net webforms braintree

我在 ASP.Net 网络表单上使用 Braintree dropin,但无法读取从 javascript 返回的随机数。它正在生成,但在我的服务器端代码上我无法访问它。我怀疑这是由于在 Javascript 代码完成之前调用了服务器端代码,但由于 Web 开发不是我的强项,我不确定。

我的客户端代码 TestBrainTree.aspx:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="TestBrainTree2.aspx.vb" Inherits="eStore2.TestBrainTree2" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta charset="utf-8">
  <script src="https://js.braintreegateway.com/web/dropin/1.16.0/js/dropin.min.js"></script>
</head>
<body>
   <form id="form1" runat="server"> 
       <div id="dropin-container"></div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"></asp:ScriptManager>  
          <button id="btnSubmit">Request payment method</button>
        <asp:label id="lblResult" runat="server"></asp:label>
    <input id="payment_method_nonce" name="payment_method_nonce" type="hidden" />
    </form> 
  <script>
    var button = document.querySelector('#btnSubmit');

    braintree.dropin.create({
      authorization: '<%=clientToken%>',
      container: '#dropin-container'
    }, function (createErr, instance) {
      button.addEventListener('click', function () {
        instance.requestPaymentMethod(function (err, payload) {
          // Submit payload.nonce to your server
            document.querySelector('#payment_method_nonce').value = payload.nonce;
            alert(document.querySelector('#payment_method_nonce').value);
         });
      });
    });
  </script>
</body>
</html>

alert(document.querySelector('#payment_method_nonce').value); 行表明随机数已经生成成功。我的服务器端代码 TestBraintree2.aspx.vb:

Imports Braintree

Public Class TestBrainTree2
    Inherits System.Web.UI.Page

    '#Region page variables
    Public clientToken As String
    '#endregion

    Private gateway As BraintreeGateway = New BraintreeGateway With {
        .Environment = Braintree.Environment.SANDBOX,
                    .PublicKey = "XXXX",
                    .PrivateKey = "YYYY",
                    .MerchantId = "ZZZZ"
    }

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        ClientScript.GetPostBackEventReference(Me, String.Empty)

        If Not IsPostBack Then
            clientToken = gateway.ClientToken.Generate()
        Else
            Dim nonce As String = Request.Form("payment_method_nonce")
            Dim request2 = New TransactionRequest With {
                .Amount = 10D,
                .PaymentMethodNonce = nonce
            }
            Dim result As Result(Of Transaction) = gateway.Transaction.Sale(request2)

            If result.IsSuccess() Then
                lblResult.Text = String.Format("<b>Transaction id:</b>{0}", result.Target.Id)
            Else
                lblResult.Text = "Error"
            End If
        End If
    End Sub

End Class

为了安全起见,我在上面的代码中隐藏了我的 key 。问题出现在 Dim nonce As String = Request.Form("payment_method_nonce") 行中,我希望看到在客户端生成的 nonce,但它是空白的。

最佳答案

您没有看到 nonce 的原因是正确的,因为表单是在您设置 nonce 之前提交的。

将您的前端代码更改为以下内容以解决该问题。该代码阻止表单提交,直到它获得随机数。一旦获得随机数,它将自动提交表单。

<script>
  var form = document.querySelector('#form1');

  braintree.dropin.create({
    authorization: '<%=clientToken%>',
    container: '#dropin-container'
  }, function (createErr, instance) {
    form.addEventListener('submit', function (event) {
      event.preventDefault();

      instance.requestPaymentMethod(function (err, payload) {
        if (err) {
          console.log('Error', err);
          return;
        }

        // Add the nonce to the form and submit
        document.querySelector('#payment_method_nonce').value = payload.nonce;
        form.submit();
      });
    });
  });
</script>

关于javascript - Braintree 集成 - 无法在服务器端代码中访问 javascript nonce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55155806/

相关文章:

javascript - 单击函数执行当前和先前的函数代码

asp.net - 切换到 ASP.NET 3.5,DropDownList 不记得动态添加的项目

c# - asp.net webform以编程方式添加透明图像

c# - 当 "externalizing"某些配置设置进入外部文件时行为不同

javascript - jquery ajax调用重定向到命名url而不是相同的模板

javascript - 打字时向数字添加逗号

javascript - Bootstrap Accordion 切换逻辑

javascript - 单击文本时在转发器中选择/取消选择复选框

javascript - 部分更新后如何在 ng-app 范围之外编译 html

webforms - 在 .Net 中使用 <button> 而不是 &lt;input&gt;