передача одноразового номера на сервер и обратно в Braintree SDK - PullRequest
1 голос
/ 20 октября 2019

Следующее представление генерирует правильный одноразовый номер, о чем свидетельствует предупреждение в коде javascript.

<div class='row'>
  <div class='small-12 columns text-center'>
    <h4><%= t('proceed_to_payment') %> <%= number_to_currency(@clientorder.payment_amount) %></h4>
    <% if !@clientorder.paid? %>
      <%= form_tag transacted_clientorders_path(id: @clientorder.id), id: 'checkout' do %>
        <input type="hidden" id="nonce" name="payment_method_nonce" />
        <div id='dropin-container'></div>
        <%= submit_tag t('submit'), id: 'submit-button' %>
      <% end %>
      <script>
        $.ajax({
          method: "POST",
          url: "/transacted?id=<%= @clientorder.id %>&locale=<%= I18n.locale %>",
          data: { payment_method_nonce: payload.nonce }
        })
      </script>
      <script>
        var button = document.querySelector('#submit-button');
        braintree.dropin.create({
          authorization: "<%= @client_token %>",
          container: '#dropin-container'
          }, function (createErr, instance) {
            button.addEventListener('click', function () {
              instance.requestPaymentMethod(function (err, payload) {
                alert(payload.nonce);
                console.log(payload.nonce);
                console.log(err);
                if (err) {
                  console.log('Error', err);
                  return;
                }
             // Add the nonce to the form and submit
               document.querySelector('#nonce').value = payload.nonce;
               form.submit();
             });
            });
          });
      </script>
    <% end %>
  </div>
</div>

действие контроллера

  def transacted
    @result = Braintree::Transaction.sale(
      amount:  @clientorder.payment_amount,
      payment_method_nonce: params[:payment_method_nonce], 
      options: {
        submit_for_settlement: true},
      )
    if @result.transaction.status == "submitted_for_settlement"
      [...]

, однако не приводит к каким-либо дальнейшим действиям,@result равно nil, поскольку одноразовый номер не передается, и на практике сумма, которая также не была передана для следующих параметров, регистрируется в параметрах запроса:

{"utf8"=>"✓",
 "authenticity_token"=>"qXjwFuI4mNRM+ZFoQ5TwvUBv58fLNVJyQVHJm/FfBdIaArbfhjJP0WirTe+7FnSl+/asJ+fY+d+JPA7xKNLP6Q==",
 "payment_method_nonce"=>"",
 "commit"=>"Submit",
 "id"=>"4",
 "locale"=>"en"}

, где это отклонилось от правильного пути?

1 Ответ

0 голосов
/ 22 октября 2019

Есть несколько неправильных вещей.

  1. Вызов ajax в этой позиции не обрабатывает одноразовый номер
  2. При настройке таким образом, будет 2 вызована сервер: вызов ajax и сам вызов формы
  3. Следствием пункта 2 является то, что вызов формы будет иметь пустой одноразовый номер и, следовательно, будет генерировать !result.success? и, следовательно, хеш result.errors, который долженв конечном итоге будет обработан.

Таким образом,

<div class='row'>
<div class='small-12 columns text-center'>
  <div id="dropin-container"></div>
  <button id="submit-button" class='button success'><%= t('proceed_to_payment') %> <%= number_to_currency(@clientorder.payment_amount) %></button>
  <script>
    var button = document.querySelector('#submit-button');

    braintree.dropin.create({
      authorization: '<%= @client_token %>',
      container: '#dropin-container'
    }, function (createErr, instance) {
      button.addEventListener('click', function () {
        instance.requestPaymentMethod(function (err, payload) {
          // Submit payload.nonce to your server
        $.ajax({
          method: "POST",
          url: "<%= transacted_clientorders_path(id: @clientorder.id, locale: I18n.locale) %>",
          data: { payment_method_nonce: payload.nonce }
        })
        if (err) {
          console.log('Error', err);
          return;
        }
           // Add the nonce to the form and submit
                document.querySelector('#nonce').value = payload.nonce;
                form.submit();
        });
      });
    });
  </script>
...