通过 wicked gem 向导页面上的条带结帐在加载时出现错误,如何解决?
Stripe checkout on wizard page via wicked gem gives error on loading, how to resolve?
现在我在 submit.html.erb 加载时收到此错误消息:Cannot charge a customer that has no active card
.
我想了解如何改进我的控制器。目标是在提交页面加载时不出现错误消息。但前提是实际用户提交了虚假信息。
class SubmissionsController < ApplicationController
include Wicked::Wizard
steps :name, :details, :comments, :submit, :thankyou
def show
@company = Company.find(params[:company_id])
render_wizard
end
def update
@company = Company.find(params[:company_id])
# one time checkout
@amount = 50
@description = 'Premium Package'
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:source => params[:stripeToken]
)
Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => @description,
:currency => 'eur'
)
rescue Stripe::CardError => e
flash[:error] = e.message
params[:company][:status] = step.to_s
params[:company][:status] = 'active' if step == steps.last
@company.update_attributes(company_params)
render_wizard @company
end
private ...
这是submit.html.erb
<%= form_for @company, url: wizard_path, method: :put do |f| %>
<article>
<% if flash[:error].present? %>
<div id="error_explanation">
<p><%= flash[:error] %></p>
</div>
<% end %>
<label class="amount">
<span>Amount: €0.50</span>
</label>
</article>
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
data-description=<% @description %>
data-amount=<% @amount %>
data-locale="auto"></script>
<% end %>
如果我能提供更多的上下文,请指教。
重构为这个,现在可以用了:
class SubmissionsController < ApplicationController
include Wicked::Wizard
steps :name, :details, :comments, :submit, :thankyou
def show
get_company
set_package
render_wizard
end
def update
case step
when :thankyou
get_company
render_wizard @company
when :submit
get_company
set_package
if request.put?
create_customer
do_payment
render_wizard @company
end
else
get_company
params[:company][:status] = 'active' if step == steps.last
@company.update_attributes(company_params)
render_wizard @company
end
end
def get_company
@company = Company.find(params[:company_id])
end
def create_customer
@customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:source => params[:stripeToken]
)
end
def set_package
@amount = 50
@amount_in_decimals = @amount / 100.00
@description = "Premium Package"
end
def do_payment
Stripe::Charge.create(
:customer => @customer.id,
:amount => @amount,
:description => @description,
:currency => "eur"
)
rescue Stripe::CardError => e
flash[:error] = e.message
end
和视图
<label class="amount">
<span>Amount: <%= number_to_currency(@amount_in_decimals, :precision => 2, :locale => :nl) %></span>
</label>
</article>
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
data-name="RailsApp!"
data-description='<%= @description %>'
data-amount=<%= @amount %>
data-locale="auto"
data-currency="eur"></script>
<% end %>
现在我在 submit.html.erb 加载时收到此错误消息:Cannot charge a customer that has no active card
.
我想了解如何改进我的控制器。目标是在提交页面加载时不出现错误消息。但前提是实际用户提交了虚假信息。
class SubmissionsController < ApplicationController
include Wicked::Wizard
steps :name, :details, :comments, :submit, :thankyou
def show
@company = Company.find(params[:company_id])
render_wizard
end
def update
@company = Company.find(params[:company_id])
# one time checkout
@amount = 50
@description = 'Premium Package'
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:source => params[:stripeToken]
)
Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => @description,
:currency => 'eur'
)
rescue Stripe::CardError => e
flash[:error] = e.message
params[:company][:status] = step.to_s
params[:company][:status] = 'active' if step == steps.last
@company.update_attributes(company_params)
render_wizard @company
end
private ...
这是submit.html.erb
<%= form_for @company, url: wizard_path, method: :put do |f| %>
<article>
<% if flash[:error].present? %>
<div id="error_explanation">
<p><%= flash[:error] %></p>
</div>
<% end %>
<label class="amount">
<span>Amount: €0.50</span>
</label>
</article>
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
data-description=<% @description %>
data-amount=<% @amount %>
data-locale="auto"></script>
<% end %>
如果我能提供更多的上下文,请指教。
重构为这个,现在可以用了:
class SubmissionsController < ApplicationController
include Wicked::Wizard
steps :name, :details, :comments, :submit, :thankyou
def show
get_company
set_package
render_wizard
end
def update
case step
when :thankyou
get_company
render_wizard @company
when :submit
get_company
set_package
if request.put?
create_customer
do_payment
render_wizard @company
end
else
get_company
params[:company][:status] = 'active' if step == steps.last
@company.update_attributes(company_params)
render_wizard @company
end
end
def get_company
@company = Company.find(params[:company_id])
end
def create_customer
@customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:source => params[:stripeToken]
)
end
def set_package
@amount = 50
@amount_in_decimals = @amount / 100.00
@description = "Premium Package"
end
def do_payment
Stripe::Charge.create(
:customer => @customer.id,
:amount => @amount,
:description => @description,
:currency => "eur"
)
rescue Stripe::CardError => e
flash[:error] = e.message
end
和视图
<label class="amount">
<span>Amount: <%= number_to_currency(@amount_in_decimals, :precision => 2, :locale => :nl) %></span>
</label>
</article>
<script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="<%= Rails.configuration.stripe[:publishable_key] %>"
data-name="RailsApp!"
data-description='<%= @description %>'
data-amount=<%= @amount %>
data-locale="auto"
data-currency="eur"></script>
<% end %>