如何在 Rails 4 应用程序中从 javascript 生成的按钮调用控制器功能?

How to call controller function from javascript generated button in Rails 4 app?

我已将 Stripe.js 集成到我的 rails 应用程序中。该应用程序生成 "Pay with Card" 按钮。我想知道如何调用控制器函数来调用 Stripe API 以接收付款。

show.html.erb:

<div class="col-xs-12">
        <div class="btn-group pull-right" role="group" aria-label="..." style="margin-top:10px;">
            <%= link_to 'Back to Products', products_path, class: "btn btn-default btn-info" %>
    <%= button_to 'Pay with Card',
    <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= "<%= @shopping_cart.total*100 %>"
      data-locale="auto"></script> %>
      <!--
    <button type="button" class="btn btn-default btn-success">
      <span class="fa fa-shopping-cart"></span>
      &nbsp;Checkout
    </button> -->
        </div>
    </div>

shopping_carts_controller.rb

def checkout
  @shopping_cart.process_payment stripe_params
  redirect_to products_path
  flash[:notice] = "Succefully made payment."
end

如何调用 checkout 方法?

通过以下步骤在 stripe 中收取费用

1) 从用户处获取卡的详细信息

2) 将卡片详细信息提交到 stripe

3) 条纹 returns 你一个令牌

4) 使用stripe token通过stripe向用户收费charge API

这可以是从用户那里获取卡片详细信息的视图

<%= form_tag charge_amount_path do %>
  <article>
    <% if flash[:error].present? %>
      <div id="error_explanation">
        <p><%= flash[:error] %></p>
      </div>
    <% end %>
    <label class="amount">
      <span>Amount: .00</span>
    </label>
  </article>

  <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
  data-key="some-key"
  data-description="A month's subscription"
  data-amount="500"
  data-locale="auto"></script>
<% end %>

当用户提交此表单时,stripe returns stripe token,您可以使用此 token 来创建费用。

有一个控制器方法,这将是提交表单后调用的方法

def charge_amount
charge = Stripe::Charge.create({
                 :amount => 100,
                 :card => params[:stripeToken],
                 :description => "blah-blah,
                 :currency => 'usd'
                 })
end

来自 stripe 的此方法的参数将类似于

Parameters: {"utf8"=>"✓", "authenticity_token"=>"rhYPiRCDLQJ4F9/B09TKgiyS11YGvP34hI5/Bi9n2nB9BbiBQXAMZWxdwkjVEkiy5+PJaKMnqraWSeu+a0Fn8Q==", "stripeToken"=>"tok_198sjvLeNQnnrmxRqgbTq12n", "stripeTokenType"=>"card", "stripeEmail"=>"vcjhewv@gmail.com"}

您需要确保您的 Checkout HTML 片段位于 <form> 标签内,并且 action 设置为 [=12] 的 URL =].