希望在成功完成条纹结账付款后提交Rails表单

时间:2015-01-14 00:14:32

标签: ruby-on-rails stripe-payments

我正在使用Rails 4.2,并尝试在我的rails应用程序中集成Stripe Checkout(https://stripe.com/docs/checkout/guides/rails)并且有一个我在任何地方都看不到的情景。注意:我尝试从许多在线资源中进行自定义表单集成,但无法使其工作,因此选择结帐。

在我的rails应用程序中,我有一个订单表,我想要完成的主要事情是有一个表单,用户可以提交他们的个人信息(不付款)下订单。然后,条带结账集成将允许他们付款;但是,如果没有记录条带费用,则不会在数据库中创建订单记录。使用单独的"费用"我无法做到这一点。条纹建议的控制器,并尝试将条带代码合并到我的订单控制器中(见下文)。

我应该注意,我能够获取结帐按钮以提交条带并处理费用,但尚未能够获得订单记录在我的数据库中创建。

我已经广泛搜索了这个问题的答案(目前正在等待条纹支持的响应)。任何建议将不胜感激!

orders_controller.rb

(这是我尝试将他们建议的充电控制器中的条带代码组合到我自己的订单控制器中的示例。我现在不确定在处理费用之后要做什么来将其转到提交表格)

def create
  @order = Order.new(order_params)

  customer = Stripe::Customer.create(
    :email => 'example@stripe.com',
    :card  => params[:stripeToken]
  )

  charge = Stripe::Charge.create(
    :customer    => customer.id,
    :amount      => 5000,
    :description => 'Rails Stripe customer',
    :currency    => 'usd'
  )

  rescue Stripe::CardError => e
    flash[:error] = e.message
    render 'new'
  end

订单/ new.html.erb

(我正在为我表单中的所有其他字段留下代码,这只是显示我的表单提交按钮和条带结帐按钮。理想情况下,我可以将操作组合到一个按钮中,或者只是将提交结合起来当付款通过条带成功处理时

<%= form_for @order do |f| %>
    // lots of form fields
<%= f.submit %>

<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"></script>

1 个答案:

答案 0 :(得分:14)

通常你会这样做......

def create
  @order = Order.new(order_params)
  charge_error = nil

  if @order.valid?
    begin
      customer = Stripe::Customer.create(
        :email => 'example@stripe.com',
        :card  => params[:stripeToken])

      charge = Stripe::Charge.create(
        :customer    => customer.id,
        :amount      => 5000,
        :description => 'Rails Stripe customer',
        :currency    => 'usd')

    rescue Stripe::CardError => e
      charge_error = e.message
    end
    if charge_error
      flash[:error] = charge_error
      render :new
    else
      @order.save
      redirect_to (successful page)
    end
  else
    flash[:error] = 'one or more errors in your order'
    render :new
  end
end

这样,除非验证了@order,否则不会收取费用,除非收费成功,否则不会保存@order。