首页 文章

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

提问于
浏览
6

我正在使用Rails 4.2,并尝试在我的rails应用程序中集成Stripe Checkout(https://stripe.com/docs/checkout/guides/rails)并且有一个方案我没有't seen outlined anywhere. Note: I tried custom form integration from a number of online resources but couldn' t让它工作因此选择结帐 .

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

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

我已经广泛搜索了这个问题的答案(目前正在等待条纹支持的响应) . 我们欢迎所有的建议!

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

orders/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 回答

  • 13

    通常你会......

    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 .

相关问题