我创建了一个简单的付款表单,其中包含接受金额的字段,插入式用户界面和提交按钮。
<form id="form1" runat="server">
<div>
<label>Amount:</label>
<asp:TextBox ID="txtAmount" runat="server" />
</div>
<div id="dropin-container"></div>
<asp:Button ID="btnSubmit" runat="server" OnClick="btnSubmit_Click" Text="Submit" />
<script src="https://js.braintreegateway.com/v2/braintree.js"></script>
<script>
braintree.setup("<%= this.ClientToken %>", "dropin", { container: "dropin-container" });
</script>
和背后的代码
protected string ClientToken = String.Empty;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GenerateClientToken();
}
}
protected void GenerateClientToken()
{
var gateway = new BraintreeGateway
{
Environment = Braintree.Environment.SANDBOX,
MerchantId = "merchant-id",
PublicKey = "public-key",
PrivateKey = "private-key"
};
this.ClientToken = gateway.ClientToken.generate();
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
var gateway = new BraintreeGateway
{
Environment = Braintree.Environment.SANDBOX,
MerchantId = "merchant-id",
PublicKey = "public-key",
PrivateKey = "private-key"
};
var request = new TransactionRequest
{
Amount = Convert.ToDecimal(this.txtAmount.Text),
PaymentMethodNonce = Request.Form["payment_method_nonce"]
};
Result<Transaction> result = gateway.Transaction.Sale(request);
}
在浏览器中加载页面后,我可以看到接受金额的表单以及接受信用卡和/或PayPal的插入式ui表单。
问题是,当我单击“提交”按钮时,方法btnSubmit_Click不会被调用。该页面看起来像是正确回发但我看不到btnSubmit_Click中的任何代码行被执行。
我按照此页面的说明操作: https://www.braintreepayments.com/features/drop-in
但我真的无法想到我想念的任何事情。
任何人都可以帮助我解决这个问题,我将非常感激。非常感谢你。
诺特
答案 0 :(得分:3)
我在Braintree工作,可以帮助您解决这个问题。
当您在页面上加载Drop-in时,braintree.js正在做什么的一些背景:它监听表单提交,当它检测到表单提交时,它将中断表单提交,与Braintree通信以生成nonce,以及然后在定义时运行你的回调。发生的事情是您的.NET回发事件正在广播提交操作 - 与braintree.js首先中断的操作类型相同。
作为解决方法,您可以尝试将以下内容添加到Page_Load代码中:
ClientScript.GetPostBackEventReference(this, string.Empty);
ClientScript.RegisterClientScriptBlock(this.GetType(), "PayEvent","<script>function PayEvent() {document.getElementById('__EVENTTARGET').value = '"+ btnSubmit.ClientID +"'; }</script>" );
btnSubmit.Attributes.Add("onClick", "PayEvent()");
其中btnSubmit是按钮的ID。
这应该绕过提交中断并允许您的表单正确提交。此外,我们的custom integration替代方案不会出现此问题。
如果您有任何其他问题,请告诉我们。
答案 1 :(得分:0)
您只需要将您的交易请求代码放在一个方法中,然后在帖子上调用该子文件而不是页面加载。
这样,自动提交不会中断事情。
Protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
GetClientToken();
} else {
Pay();
}
}
protected void Pay() {
PaymentMethodNonce = Request.Form["payment_method_nonce"]
//Build request string etc.
}
答案 2 :(得分:-1)
布赖恩,
上面的解决方案是由PayPal支持提供给我的,但不幸的是,它并没有解决问题。
老实说,正是这种'倾听'(读:不可靠,'聪明的代码')来形成提交,当一个人试图将它集成到Web Forms / UpdatePanel页面时会导致所有问题 - 它真的不是'为WebForms / UpdatePanels设计,需要各种非常混乱的代码才能使其正常工作和同步。它几乎就好像它从未被设计用于除MVC或Java之外的任何东西!
如果我们可以在OnClientClick上附加一个JavaScript调用,可以通过托管在PayPal上的JavaScript模块同步调用BrainTree / PayPal来返回nonce,那么我们可以用它做一些事情。 。现在,Braintree / PayPal代码拦截了一个提交按钮(默认情况下,WebForms中的所有按钮都是'提交',这会导致问题)并异步触发一个调用来获取一个随机数,同时调用该按钮单击C#代码。最终结果是C#代码在Braintree / PayPal调用返回之前运行,您永远不能同步这两个。