2015-04-27 1 views
1

Я создал простую форму оплаты, в которой содержатся поля, которые принимают количество, интерфейс ввода и кнопку отправки.Интерфейс Drop-In Braintree в веб-форме ASP.NET с методом кнопки отправки не вызывается при нажатии

<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); 
} 

После того как я загрузить страницу в браузере, я могу видеть форму, которые принимают количество, а также падение в виде Ui, которые принимают к оплате кредитные карты и/или PayPal.

Проблема заключается в том, когда я нажимаю кнопку «Отправить», метод btnSubmit_Click не вызывается. Эта страница выглядит так, как будто она вернётся правильно, но я не вижу никакой строки кода внутри btnSubmit_Click.

Я следовать инструкциям из этой страницы: https://www.braintreepayments.com/features/drop-in

Но я действительно не могу думать ни о чем, что я скучаю.

Любой, кто может мне помочь в этом вопросе, будет очень благодарен. Огромное спасибо.

Нотт

ответ

3

Я работаю в Braintree и может помочь вам с этим вопросом.

Некоторые сведения о том, что делает braintree.js при загрузке Drop-In на вашей странице: он прослушивает формы, и когда он обнаруживает один, он прерывает форму submit, связывается с Braintree для генерации nonce, а затем запустите свой обратный вызов, если он определен. Что происходит, так это то, что ваше событие postback в .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 это идентификатор вашей кнопки.

Это должно обходить прерывание отправки и разрешать отправку вашей формы должным образом. Кроме того, эта проблема не возникает с нашим custom integration в качестве альтернативы.

Сообщите нам, если у вас есть дополнительные вопросы.

+0

Привет, Брайан, мне интересно, что делает первая строка вашего кода? похоже, что это вызов, чтобы получить что-то, и этот метод возвращает строку. Но он не присваивает какой-либо переменной или не используется позднее. – knott

-1

Брайан,

Ваше решение выше было поставлено мне поддержку PayPal, но, к сожалению, это не решает проблему.

Чтобы быть честным, это «прослушивание» (чтение: ненадежный, «умный код») для формирования представлений, которые вызывают все проблемы, когда вы пытаетесь интегрировать его на странице веб-форм/UpdatePanel - это действительно isn 't предназначен для WebForms/UpdatePanels и требует, чтобы все виды действительно грязного кода позволяли ему работать и синхронизироваться должным образом. Это почти так, как будто это никогда не предназначалось ни для чего, кроме MVC или Java!

Что было бы гораздо лучшим решением, если бы мы могли прикрепить вызов JavaScript в OnClientClick кнопки, которая синхронно вызывает BrainTree/PayPal через модуль JavaScript, размещенный в PayPal, который возвращает nonce, чтобы мы могли что-то сделать с помощью Это.В настоящее время код Braintree/PayPal перехватывает кнопку отправки (все кнопки в WebForms по умолчанию «отправляются», так что это вызывает проблемы) и асинхронно отключает асинхронный вызов для получения номера и в одно и то же время, вызывает кнопку OnClick в коде C#. Конечным результатом является то, что код C# запускается до вызова Braintree/PayPal, и вы никогда не сможете синхронизировать их.

+0

Это не ответ, это ответ на ответ. – PeteGO

+0

Неужели вы решили эту проблему? – user3713398

+0

Да, я решил это. Код PayPal/Braintree, очевидно, не предназначен для работы с WebForms, потому что он перехватывает систему обратной передачи WebForms для выполнения своей собственной асинхронной активности и не синхронизируется повторно, поэтому она заканчивается в разное время до системы обратной передачи веб-форм. В принципе, это непригодно. В конце концов я использовал JavaScript в сценарии PayPal/Braintree, чтобы получить nonce, получить его обратно, поместить в скрытое поле WebForms и затем активировать кнопку сохранения. Когда код C# работает, он получил nonce из скрытого поля и затем смог выполнить то, что я хотел сделать. – Graham

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. 
} 
Смежные вопросы