gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:07:09 24 4
gpt4 key购买 nike

我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com