0

フォームが十分な支払い情報を返さないことを示すストライプエラーであるエラーThis customer has no attached payment sourceが返されるため、私は自分のStripe統合設定を正しく持っています。stripeTokenがフォームに返されない

これは私のsubscriptions.js.coffee次のとおりです。

stripeResponseHandler = (status, response) -> 
    $form = $('#payment-form') 
    if response.error 
    #Show the errors on the form 
    $form.find('.payment-errors').text response.error.message 
    $form.find('button').prop 'disabled', false 
    else 
    # response contains id and card, which contains additional card details 
    token = response.id 
    #Insert the token into the form so it gets submitted to the server 
    $form.append $('<input type="hidden" name="stripeToken" />').val(token) 
    # and submit 
    $form.get(0).submit() 
    return 

jQuery ($) -> 
    $('payment-form').submit (event) -> 
    $form = $(this) 
    $form.find('button').attr 'disabled', true 
    Stripe.card.createToken $form, stripeResponseHandler 
    false 
    return 

これはnew.html.erbでの私のフォームです:

<% unless @subscription.errors.blank? %> 
    <%= @subscription.errors.full_messages.to_sentence %> 
<% end %> 

<h2>Subcribing to <%= @plan.name %></h2> 

<%= form_for @subscription, html: {id: 'payment-form'} do |f| %> 
    <input type="hidden" name="plan_id", value="<%= @plan.id %>" /> 
    <span class="payment-errors"></span> 

    <div class="form-row"> 
    <label> 
     <span>Email Address</span> 
     <input type="email" size="20" name="email_address" /> 
    </label> 
    </div> 

    <div class="form-row"> 
    <label> 
     <span>Card Number</span> 
     <input type="text" size="20" data-stripe="number" /> 
    </label> 
    </div> 

    <div class="form-row"> 
    <label> 
     <span>CVC</span> 
     <input type="text" size="4" data-stripe="cvc" /> 
    </label> 
    </div> 

    <div class="form-row"> 
    <label> 
     <span>Expiration (MM/YYYY)</span> 
     <input type="text" size="2" data-stripe="exp-month" /> 
    </label> 
    <span>/</span> 
    <input type="text" size="4" data-stripe="exp-year" /> 
    </div> 

    <button type="submit">Pay Now</button> 
<% end %> 

これはSubscriptionsController#Createです:

def create 
    @plan = Plan.find(params[:plan_id]) 
    @subscription = CreateSubscription.call(
     @plan, 
     params[:email_address], 
     params[:stripeToken] 
    ) 
    if @subscription.errors.blank? 
     flash[:notice] = "Thank you for your purchase! Please click the link in the email we just sent you to get started." 
     redirect_to authenticated_root_path 
    else 
     render :new 
    end 
    end 

上記のコールこのapp/services/create_subscription.rb

class CreateSubscription 
    def self.call(plan, email_address, token) 
    user, raw_token = CreateUser.call(email_address) 

    subscription = Subscription.new(
     plan: plan, 
     user: user 
    ) 

    begin 
     stripe_sub = nil 
     if user.stripe_customer_id.blank? 
     binding.pry 
     customer = Stripe::Customer.create(
      source: token, 
      email: user.email, 
      plan: plan.stripe_id 
     ) 

     user.stripe_customer_id = customer.id 
     user.save! 
     stripe_sub = customer.subscriptions.first 
     else 
     customer = Stripe::Customer.retrieve(user.stripe_customer_id) 
     stripe_sub = customer.subscriptions.create(
      plan: plan.stripe_id 
     ) 
     end 

     subscription.stripe_id = stripe_sub.id 

     subscription.save! 
    rescue Stripe::StripeError => e 
     subscription.errors[:base] << e.message 
    end 

    subscription 
    end 
end 

私はそのcreatebinding.pryを使用して、これをしたときので、私は、フォームがstripeTokenを受信して​​いないことを知っている理由は、何params[:stripeToken]がないこと

00:52:31 web.1    |  14: def create 
00:52:31 web.1    |  15: @plan = Plan.find(params[:plan_id]) 
00:52:31 web.1    | => 16: binding.pry 
00:52:31 web.1    |  17: @subscription = CreateSubscription.call(
00:52:31 web.1    |  18:  @plan, 
00:52:31 web.1    |  19:  params[:email_address], 
00:52:31 web.1    |  20:  params[:stripeToken] 
00:52:31 web.1    |  21: ) 
00:52:31 web.1    |  22: if @subscription.errors.blank? 
00:52:31 web.1    |  23:  flash[:notice] = "Thank you for your purchase! Please click the link in the email we just sent you to get started." 
00:52:31 web.1    |  24:  redirect_to authenticated_root_path 
00:52:31 web.1    |  25: else 
00:52:31 web.1    |  26:  render :new 
00:52:31 web.1    |  27: end 
00:52:31 web.1    |  28: end 
00:52:31 web.1    | 
[1] pry(#<SubscriptionsController>)> params 
00:52:37 web.1    | => {"utf8"=>"✓", "plan_id"=>"1", "email_address"=>"[email protected]", "action"=>"create", "controller"=>"subscriptions"} 

注意してください。私は私のcreate_subscription.rbサービスにbinding.pryをしようとすると

はまた、これは私が得るものです:

00:52:41 web.1    |  10:  begin 
00:52:41 web.1    |  11:  stripe_sub = nil 
00:52:41 web.1    |  12:  if user.stripe_customer_id.blank? 
00:52:41 web.1    | => 13:   binding.pry 
00:52:41 web.1    |  14:   customer = Stripe::Customer.create(
00:52:41 web.1    |  15:   source: token, 
00:52:41 web.1    |  16:   email: user.email, 
00:52:41 web.1    |  17:   plan: plan.stripe_id 
00:52:41 web.1    |  18:  ) 
00:52:41 web.1    | 
[1] pry(CreateSubscription)> token 
00:52:44 web.1    | => nil 

この原因とどのように私はそれを修正することができますか?

+0

多分paramはコントローラのホワイトリストの一部である必要がありますか?強いparams問題かもしれないようです。 –

+0

@Armando - コントローラに他のパラメータを指定していません。他はちょうど働く。それでも指定する必要はありますか? – marcamillion

答えて

0

結局のところ、私の問題は、ダム間違いでした。私はこれを持って、私のCoffeeScriptで

お知らせ:

jQuery ($) -> 
    $('payment-form').submit (event) -> 
    $form = $(this) 
    $form.find('button').attr 'disabled', true 
    Stripe.card.createToken $form, stripeResponseHandler 
    false 
    return 

問題は、フォームセレクタです。私は#をフォームのIDに追加しませんでした。これに

$('payment-form').submit (event) -> 

$('#payment-form').submit (event) -> 

それは魔法のように動作

だから一度、私はこの行を変更しました。

DOH! Faceslap

関連する問題