2017-02-22 46 views
0

Я пытаюсь интегрировать Chargebee с Braintree с помощью API ChargeBee + BraintreeJS (проще всего получить соответствие PCI). Вот ссылка методов, которые могут быть использованы (https://www.chargebee.com/docs/braintree.html). На основании этого документа, я могу сделать вывод, что эти шагиПередача BraintreeJS paynonce полезной нагрузки в веб-форму ASP.NET

1) Генерировать clientToken с помощью Braintree SDK для .NET 2) Использование BraintreeJS для разметить все размещенные поля и отправить Braintree API для получения оплаты одноразового номера 3) Использование ChargeBee SDK для .NET и отправить оплату nonce для создания подписки в ChargeBee

Мне удалось сделать (1) и (2), но моя проблема в том, как я мог прочитать платеж nonce во время обратной передачи? Я попытался с помощью контроллера, но по-прежнему получать нулевое значение

Вот мой код

<script> 
 
    var form = document.querySelector('#cardForm'); 
 
    var authorization = '<%=clientToken%>'; 
 

 
    braintree.client.create({ 
 
     authorization: authorization 
 
    }, function (err, clientInstance) { 
 
     if (err) { 
 
      console.error(err); 
 
      return; 
 
     } 
 
     createHostedFields(clientInstance); 
 
    }); 
 

 
    function createHostedFields(clientInstance) { 
 
     braintree.hostedFields.create({ 
 
      client: clientInstance, 
 
      styles: { 
 
       'input': { 
 
        'font-size': '16px', 
 
        'font-family': 'courier, monospace', 
 
        'font-weight': 'lighter', 
 
        'color': '#ccc' 
 
       }, 
 
       ':focus': { 
 
        'color': 'black' 
 
       }, 
 
       '.valid': { 
 
        'color': '#8bdda8' 
 
       } 
 
      }, 
 
      fields: { 
 
       number: { 
 
        selector: '#card-number', 
 
        placeholder: '4111 1111 1111 1111' 
 
       }, 
 
       cvv: { 
 
        selector: '#cvv', 
 
        placeholder: '123' 
 
       }, 
 
       expirationDate: { 
 
        selector: '#expiration-date', 
 
        placeholder: 'MM/YYYY' 
 
       }, 
 
       postalCode: { 
 
        selector: '#postal-code', 
 
        placeholder: '11111' 
 
       } 
 
      } 
 
     }, function (hostedFieldsErr, hostedFieldsInstance) { 
 
      if (hostedFieldsErr) { 
 
       console.error(hostedFieldsErr); 
 
       return; 
 
      } 
 

 
      submit.removeAttribute('disabled'); 
 

 
      form.addEventListener('submit', function (event) { 
 
       event.preventDefault(); 
 

 
       hostedFieldsInstance.tokenize(function (tokenizeErr, payload) { 
 
        if (tokenizeErr) { 
 
         console.error(tokenizeErr); 
 
         return; 
 
        } 
 

 
        // If this was a real integration, this is where you would 
 
        // send the nonce to your server. 
 
        var noncestr = payload.nonce 
 
        alert(noncestr); // Confirm nonce is received. 
 

 
        console.log('Got a nonce: ' + payload.nonce); 
 
        $('#paymentmethodnonce').attr("value", noncestr); // Add nonce to form element. 
 
        form.submit(); 
 
       }); 
 
       
 
      }, false); 
 
     }); 
 
    } 
 
</script>
<body> 
 
    <div class="demo-frame"> 
 
     <form action="/" method="post" id="cardForm"> 
 
      <label class="hosted-fields--label" for="card-number">Card Number</label> 
 
      <div id="card-number" class="hosted-field"></div> 
 

 
      <label class="hosted-fields--label" for="expiration-date">Expiration Date</label> 
 
      <div id="expiration-date" class="hosted-field"></div> 
 

 
      <label class="hosted-fields--label" for="cvv">CVV</label> 
 
      <div id="cvv" class="hosted-field"></div> 
 

 
      <label class="hosted-fields--label" for="postal-code">Postal Code</label> 
 
      <div id="postal-code" class="hosted-field"></div> 
 

 
      <div class="button-container"> 
 
       <input type="submit" class="button button--small button--green" value="Purchase" id="submit" /> 
 
      </div> 
 
      <asp:Label runat="server" ID="lblResult"></asp:Label> 
 
     </form> 
 
    </div> 
 
    <script src="https://js.braintreegateway.com/web/3.8.0/js/client.js"></script> 
 
    <script src="https://js.braintreegateway.com/web/3.8.0/js/hosted-fields.js"></script> 
 
</body> 
 
</html>

public partial class Default : System.Web.UI.Page 
{ 
    protected string clientToken; 
    private BraintreeGateway gateway = new BraintreeGateway 
    { 
     Environment = Braintree.Environment.SANDBOX, 
     MerchantId = "xxx", 
     PublicKey = "xxx", 
     PrivateKey = "xxx" 

    }; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //generate clienttoken from braintree sdk 
      clientToken = gateway.ClientToken.generate(); 
     } 
     else 
     { 
      var paymentnonce = Request.Form["paymentmethodnonce"]; 
     } 
    } 
} 

ответ

0

Полное раскрытие: Я работаю в Braintree. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться к support.

Обратный вызов, который вы передаете hostedFieldsInstance.tokenize использует css selector, чтобы найти элемент с идентификатором paymentmethodnonce и сохранить сгенерированный одноразовый номер внутри него. Тем не менее, нет элемента с этим идентификатором в HTML, который вы отправили. На основе HTML, который вы поделили, этот вызов должен завершиться неудачно, и ваша последующая попытка восстановить paymentmethodnonce с использованием Request.Form также завершится с ошибкой.

Вы должны решить эту проблему, добавив в форму скрытый элемент ввода с идентификатором paymentmethodnonce.

<input type="hidden" id="paymentmethodnonce" /> 

Это даст ваш tokenize обратного вызова место, чтобы положить одноразовый номер, и он будет делать нонса часть формы, которая должна позволить ваш Request.Form получить его успешно.

+0

Спасибо. Я добавил. Проблема здесь в том, что мой submit не делает PostBack. любой ключ? – mraswinc

+0

@mraswinc: я не могу предложить отличное объяснение, но я счел необходимым запустить ['ClientScript.GetPostBackEventReference (this, string.Empty);'] (https://msdn.microsoft.com/en- us/library/system.web.ui.clientscriptmanager.getpostbackeventreference (v = vs.110) .aspx) перед проверкой 'IsPostBack' в моей собственной интеграции. Этот вызов должен настроить событие postback, чтобы вы могли проверить его правильно. – jake