【问题标题】:Donations on Stripe with RailsStripe with Rails 上的捐款
【发布时间】:2014-11-04 21:39:10
【问题描述】:

我有一个带有单选按钮的表格,用于选择捐赠金额的选项。

看起来像这样:

<tr>
  <td><input type="radio" name="amount" value="10"><span>$10</span></td>
  <td><input class="awk" type="radio" name="amount" value="25"><span>$25</span></td>
</tr>
<tr>
  <td><input type="radio" name="amount" value="50"><span>$50</span></td>
  <td><input type="radio" name="amount" value="100"><span>$100</span></td>
</tr>

有一个支付按钮,可以打开 Stripes 支付网关。

我的表格是这样的:

<%= form_tag charges_path, id: 'chargeForm' do %>
  <script src="https://checkout.stripe.com/checkout.js"></script>
  <%= hidden_field_tag 'stripeToken' %>
  <%= hidden_field_tag 'stripeEmail' %>
  <button id="customButton" class="btn btn-large btn-primary">Buy Now</button>

   <script>
      var handler = StripeCheckout.configure({
      key: 'foo',
      image: '/assets/my_logo.png',
      token: function(token, args) {
            document.getElementById("stripeToken").value = token.id;                              
            document.getElementById("stripeEmail").value = token.email;
            document.getElementById("chargeForm").submit();
          }
        });

      document.getElementById('customButton').addEventListener('click', function(e) {
        // Open Checkout with further options
        handler.open({
          name: 'My Company',
          description: 'Product ($60.00)',
          amount: (100 * $('input[name=amount]:checked', '#stripe_donate').val()),
          shippingAddress: false
        });
        e.preventDefault();
      });
    </script>
<% end %>

这会加载条带模式,在支付按钮上正确显示正确的金额,但我如何告诉 RAILS 向客户收取多少费用?由于 Rails 控制器代码,Stripe 无论如何都要收取 5.00 美元:

class ChargesController < ApplicationController
  def new
  end

  def create
    # Amount in cents
    @amount = 500

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

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

  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to charges_path
    end 
end

那么我如何告诉控制器中的rails @amount 需要设置为从页面接收到的值?我是否完全跳过 rails 路线并使用纯 JS 执行此操作?

【问题讨论】:

    标签: javascript jquery ruby-on-rails stripe-payments


    【解决方案1】:

    使用金额作为参数以及条带标记向 Rails 控制器提交 ajax:

    (jquery)

    var data = {
      'amount': $('input[name="amount"]').val(),
      'stripeToken': stripeToken //what you got from checkout.js
    }
    $.post( "/charges", function( data ) {
      console.log('Sent charge to controller!')
    });
    

    (轨道)

      def create
        # Amount in cents
        @amount = params[:amount]
    

    或者,将所有内容放在一个表单中并 POST 到 /charges url,就像您可能已经在发送 stripeToken 一样。

    【讨论】:

    • 是否可以只使用stripes html属性代码并使用jquery更改数据量?
    • Checkout.js 只创建令牌。您必须将金额发送到您的服务器才能进行收费。如果您从 data-amount 属性或输入元素中提取它,这并不重要,只要您的服务器获取数量和令牌。
    • 我尝试在上面实现您的代码,但收到错误:缺少必需的参数“金额”。不知何故......我应该把你的代码放在哪里(参考我的代码)?
    • @Peege151 确保在发出 ajax 请求时设置了数量。您应该在生成令牌并选择金额后发出 ajax 请求。您可以使用 HTTPScoop 等工具来调试 ajax 请求。 tuffcode.com
    【解决方案2】:

    您应该将单选按钮放在表单内(应该只有一个表单),然后在控制器上获取该值(您可能希望将值设置为美分,或者在控制器中将其转换为美分) .

    【讨论】:

      【解决方案3】:

      首先,我将捐赠金额移动到一个常量中,并添加了对:amount 属性的支持(假设 Rails 3.x 和一个名为 Charge 的模型)。这使您可以轻松地添加或删除美元金额,并使用以下表格提交选定的美元金额:

      # /app/models/charge.rb
      DONATION_DOLLAR_AMOUNTS = [10, 25, 50, 100]
      attr_accessor :amount
      

      在视图中,移动表单内的单选按钮并使用适当的标签。我们使用常量为每一美元金额生成一个按钮。 (我删除了表格结构,因为表格不能跨表格行)。

      <%= form_tag charges_path, id: 'chargeForm' do %>
      
        <!-- generate four radio buttons with labels (TODO: move this into a helper) -->
        <% Charge::DONATION_DOLLAR_AMOUNTS.each do |amt| %>       
          <%= radio_button_tag "amount", amt %>
          <%= label_tag "amount_#{amt}", number_to_currency(amt, precision: 0) %>
      
        <script src="https://checkout.stripe.com/checkout.js"></script>
        <%= hidden_field_tag 'stripeToken' %>
        <%= hidden_field_tag 'stripeEmail' %>
        <button id="customButton" class="btn btn-large btn-primary">Buy Now</button>
        <!-- ... -->
      

      在控制器中取值:

      def create
        # Use dollar amount in param or 5 if none, then convert to cents
        @amount = (params[:amount] || 5) * 100
        # ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-27
        • 2012-04-29
        • 2019-08-08
        • 1970-01-01
        • 2014-12-23
        • 2016-01-11
        • 1970-01-01
        • 2017-01-28
        相关资源
        最近更新 更多