2017-02-07 18 views
0

Я новичок в Stripe connect, создавая приложение на рынке, используя автономный интерфейс stripe connect, и требует, чтобы пользователь вводил пользовательскую сумму для оплаты другим пользователям. Старая форма, которую я использовал, работала нормально, но как только я перешел на новую форму, my: source => params [: stripeToken] больше не генерируется, а также: stripeEmail. Чем это вызвано?Stripe standalone: ​​source => params [: stripeToken] error

Invalid source object: must be a dictionary or a non-empty string

мой оригинальный charges_controller.rb

class ChargesController < ApplicationController 

    def new 
    end 

def create 
    # Amount in cents 
    @amount = 500 

    customer = Stripe::Customer.create(
    :email => params[:stripeEmail], 
    :source => params[:stripeToken] 
) 

    charge = Stripe::Charge.create(
    :customer => customer.id, 
    :amount  => @amount, 
    :description => 'Wage Payment', 
    :currency => 'cad' 
) 

rescue Stripe::CardError => e 
    flash[:error] = e.message 
    redirect_to new_charge_path 
end 
end 

Затем я добавил методы из рецепта полосы для пользовательских сумм:

def create 
    @amount = params[:amount] 

    @amount = @amount.gsub('$', '').gsub(',', '') 

    begin 
    @amount = Float(@amount).round(2) 
    rescue 
    flash[:error] = 'Charge not completed. Please enter a valid amount in CAD ($).' 
    redirect_to new_charge_path 
    return 
    end 

    @amount = (@amount * 100).to_i # Must be an integer! 

    if @amount < 500 
    flash[:error] = 'Charge not completed. Payment amount must be at least $5.' 
    redirect_to new_charge_path 
    return 
    end 

    charge = Stripe::Charge.create(
    :amount => @amount, 
    :customer => customer.id, 
    :currency => 'cad', 
    :source => params[:stripeToken], 
    :description => ‘Payment' 
) 

    customer = Stripe::Customer.create(
    :email => params[:stripeEmail], 
    :source => params[:stripeToken] 
) 

    rescue Stripe::CardError => e 
    flash[:error] = e.message 
    redirect_to new_charge_path 
    end 

Я также изменил форму, и добавил JavaScript в charges/new.html.erb:

старый вид:

<script type="text/javascript" src="https://js.stripe.com/v2/"></script> 
<script type="text/javascript"> 
Stripe.setPublishableKey('pk_test_my_key'); 
</script> 

<%= form_tag charges_path do %> 
    <article> 
    <% if flash[:error].present? %> 
     <div id="error_explanation"> 
     <p><%= flash[:error] %></p> 
     </div> 
    <% end %> 
    <label class="amount"> 
     <span>Amount: $5.00</span> 
    </label> 
    </article> 

    <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" 
      data-key="<%= Rails.configuration.stripe[:publishable_key] %>" 
      data-description="A month's subscription" 
      data-amount="500" 
      data-locale="auto"></script> 
<% end %> 

новая форма:

<%= form_tag charges_path, id: 'form' do %> 
    <div id="error_explanation"> 
    <% if flash[:error].present? %> 
     <p><%= flash[:error] %></p> 
    <% end %> 
    </div> 
    <article> 
    <%= label_tag(:amount, 'Payment Amount:') %> 
    <%= text_field_tag(:amount) %> 
    </article> 
    <article> 
    <%= hidden_field_tag(:stripeToken) %> 
    <%= hidden_field_tag(:stripeEmail) %> 
    </article> 
    <button id='donateButton'>Pay Now</button> 
<% end %> 

<script src="https://checkout.stripe.com/checkout.js"></script> 
<script type="text/javascript"> 
Stripe.setPublishableKey('pk_test_CcUZ1IJxEqLR5RvVE3p5tx3U'); 
</script> 
<script> 


var handler = StripeCheckout.configure({ 
    key: '<%= Rails.configuration.stripe[:publishable_key] %>', 
    locale: 'auto', 
    name: 'Payments', 
    description: 'Wage', 
    token: function(token) { 
    $('input#stripeToken').val(token.id); 
    $('input#stripeEmail').val(token.id); 
    $('form').submit(); 
    } 
}); 

    $('#donateButton').on('click', function(e) { 
     e.preventDefault(); 

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

     var amount = $('input#amount').val(); 
     amount = amount.replace(/\$/g, '').replace(/\,/g, '') 

     amount = parseFloat(amount); 

     if (isNaN(amount)) { 
     $('#error_explanation').html('<p>Please enter a valid amount in CAD ($).</p>'); 
     } 
     else if (amount < 5.00) { 
     $('#error_explanation').html('<p>Wage amount must be at least $5.</p>'); 
     } 
     else { 
     amount = amount * 100; // Needs to be an integer! 
     handler.open({ 
      amount: Math.round(amount) 
     }) 
     } 
    }); 

    // Close Checkout on page navigation 
    $(window).on('popstate', function() { 
     handler.close(); 
    }); 
    </script> 

Теперь, когда я отправить настраиваемое количество, я дал следующую ошибку:

You have passed a blank string for 'source'. You should remove the 'source' parameter from your request or supply a non-blank value

Extracted source (around line #27): Stripe::Charge.create(

Не уверен, как поступить. Эта ошибка, по-видимому, связана с созданием сборов, поскольку ошибка находится в контроллере сборов. Или это в javascript новой пользовательской формы.

Что мне не хватает?

+0

Пожалуйста, проверьте значение параметра [: stripeToken], может быть, ваш токен полосы не генерируется должным образом. –

+1

Вы проверили значение параметра [: stripeToken] в вашем контроллере? –

+0

Вы правы, он не генерируется должным образом: «authenticity_token» => «kdL18CbkOWWJMnytdU/IQx4WD + 0IgfTzbLDEs1rV31O6dgLTV/MgA3HWfjBo5FgJ1mxrXxw9ZU8 + BVO7LayxQg ==", "amount" => "10", "stripeToken" => ""}. Как это исправить? – ChrisJC2017

ответ

0

У меня была точно такая же проблема. Но после нескольких часов борьбы я понял это. Причина следующая. Если вы используете Rails 4. + и используете Turbolinks вместе с ним, он загружает весь javascript для этой страницы, а когда вы загружаете модальный, javascript на этой модальной странице не работает. Вы должны отключить турбовинту.

Для меня я отключен на уровне ссылки, который является ссылкой, ответственной за загрузку платы/новой страницы. Пример: <%= link_to "Buy", new_charge_path(product_id: @product.id),'data-no-turbolink' => true %>