form_tag не создает stripeToken при отправке - PullRequest
0 голосов
/ 30 января 2019

Я следую этому учебнику за то, что настроил кнопку оформления заказа

Я изменил учебник для своих нужд, и когда я проверяю свои параметры, stripeToken пуст

{"utf8" => "✓", "authenticity_token" => "sometokenvalue", "stripeToken" => "", "amount" => "40000", "item_id" => "3"}

Я подозреваю, что получаю эту ошибку

Неверный исходный объект: должен быть словарем или непустой строкой.См. API документы на https://stripe.com/docs'

в связи с этим.

мой код следующим образом:

<p id="notice"><%= notice %></p>
<div class="container">
  <div class="row">
    <div class="col-md-12"><p>
      <strong>Name:</strong>
        <%= @item.name %>
      </p>  
      <p>
        <strong>Price:</strong>
        <%= @item.price %>
      </p>

       <script src="https://checkout.stripe.com/checkout.js"></script>

      <%= form_tag item_charges_path(@item, amount: @item.price), id: 'paying-form' do %>
          <% if flash[:error].present? %>
            <div id="error_explanation">
              <p><%= flash[:error] %></p>
            </div>
          <% end %>
        <article>
        </article>
        <article>      
          <%= hidden_field_tag :stripeToken  %>
        </article>
        <button id='donateButton' class='btn btn-primary'>Pay</button>
      <% end %>

        <%= link_to 'Edit', edit_item_path(@item) %> |
        <%= link_to 'Back', items_path %>


          <script>
            var handler = StripeCheckout.configure({
              key: '<%= Rails.configuration.stripe[:publishable_key] %>',
              locale: 'auto',
              token: function(token) {   
                $('input#stripeToken').val(token.id);
                $('form').submit();
              }
            });
          </script>
          <script>
          document.getElementById('donateButton').addEventListener('click', function(e) {
              //e.preventDefault();

              $('#error_explanation').html('');

              var amount = "#{@item.price}";
              amount = amount.replace(/\$/g, '').replace(/\,/g, '')

              amount = parseFloat(amount);

              if (isNaN(amount)) {
                $('#error_explanation').html('<p>Please enter a valid amount in USD ($).</p>');
              }
              else {
                amount = amount * 100; // Needs to be an integer!
                handler.open({
                  amount: Math.round(amount)
                })
                e.preventDefault();
              }
            });

            $(window).on('popstate', function() {
              handler.close();
            });

          </script>
    </div>
  </div>
</div>

Примечание: Я положилjs коды на той же странице для целей простоты.

Может кто-нибудь сказать мне, что не так, что моя форма не производит stripeToken?или, может быть, мне не хватает некоторых баллов?

Примечание: пожалуйста, если требуется дополнительная информация, дайте мне знать, чтобы я опубликовал Спасибо

1 Ответ

0 голосов
/ 31 января 2019

В вашем JS есть опечатка:

var amount = "#{@item.price}";

... вместо этого должно быть ...

var amount = <%= @item.price %>;

Затем переместите следующий код вверху чуть нижестрока: addEventListener

e.preventDefault();

Затем удалите следующее, потому что оно вам больше не нужно, поскольку @item.price поступает непосредственно из вашей базы данных:

amount = amount.replace(/\$/g, '').replace(/\,/g, '')
amount = parseFloat(amount);

Наконец, потому чтоamount гарантированно будет правильным и имеет целочисленное значение, тогда вам больше не нужно следующее, поэтому удалите их:

if (isNaN(amount)) {
  $('#error_explanation').html('<p>Please enter a valid amount in USD ($).</p>');
}

не забудьте удалить висячий } else { } code

Объяснение:

  • Если я правильно понимаю, когда смотрю на ваш код, всякий раз, когда вы нажимаете кнопку "Пожертвовать" из-за опечатки,ваш if (isNaN(amount)) в основном оценивается как if (isNaN("#{@item.price}") (что является СТРОКОЙ !!!), и именно поэтому isNaN("#{@item.price}") всегда равняется true (потому что это не число!), и, следовательно, условие elseкоторый ...

    handler.open({
      amount: Math.round(amount)
    })
    e.preventDefault();
    

    ... никогда не вызывается.Обратите внимание, что e.preventDefault() выше никогда не вызывается!... это означает, что ваша форма отправляет "нормальный путь", не открывая модальную полосу.Если моя теория верна, именно поэтому :stripeToken является пустой строкой, потому что значение по умолчанию для вашего hidden_tag :stripeToken является пустым значением, которое означает '', а не правильный путь: то есть после нажатия кнопки «Пожертвовать»,должен появиться модальный Stripe, и после завершения транзакции Stripe будет вызван обратный вызов функции token:

    token: function(token) {   
      $('input#stripeToken').val(token.id);
      $('form').submit();
    }
    

    ..., который, как вы видели выше, обновит ваш stripeToken вход для правильного значения токена.И затем, как вы могли видеть выше, форма будет отправлена, но теперь у ввода stripeToken есть значение, потому что вы только что обновили его.

PS Haven 'T используется Stripe как таковой

...