【问题标题】:Looking to Submit Rails Form Only After Successful Stripe Checkout Payment仅在成功条纹结帐付款后才希望提交 Rails 表格
【发布时间】:2015-03-12 02:24:28
【问题描述】:

我正在使用 Rails 4.2,并尝试将 Stripe Checkout (https://stripe.com/docs/checkout/guides/rails) 集成到我的 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

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>

【问题讨论】:

    标签: ruby-on-rails stripe-payments


    【解决方案1】:

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

    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 不会被保存。

    【讨论】:

    • 非常感谢。像魅力一样工作!
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2022-06-10
    • 2012-12-17
    • 2012-07-31
    相关资源
    最近更新 更多