2014-09-11 65 views
0

我有一个带有单选按钮的表单来选择捐赠金额的选项。Stripe with Rails上的捐款

,看起来像这样:

<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> 

有一个支付按钮,打开条纹支付网关。

,因为我有形式是这样的:

<%= 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多少向客户收取?条纹充电$ 5.00不管是什么,因为铁轨控制器代码:

class ChargesController < ApplicationController 
    def new 
    end 

    def create 
    # Amount in cents 
    @amount = 500 

    customer = Stripe::Customer.create(
     :email => '[email protected]', 
     :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 

所以我如何告诉,该@amount需要设置从页面收到一个值时,控制器轨道?我是否完全跳过导轨路线并使用纯JS执行此操作?

回答

1

首先,我将捐赠金额转移到常数中,并添加了对: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 
    # ... 
0

做一个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一样。

+0

是否可以只使用条纹HTML代码attribuets并与jQuery改变数据量? – Peege151 2014-09-11 04:26:47

+0

Checkout.js只创建令牌。您必须将金额存入服务器才能收取费用。如果您从数据量属性或输入元素中获取数据,那么只要您的服务器获取金额和令牌,则它并不重要。 – 2014-09-11 04:43:20

+0

我试图在上面实现你的代码,但得到了错误:缺少所需的参数'数量'。不知何故......我应该把你的代码放在哪里(参考我的代码)? – Peege151 2014-09-11 05:04:16

0

您应该将单选按钮放在窗体的内部(应该只有一个窗体),然后在控制器上获取该值(您可能希望将值设置为美分,否则将其转换为控制器中的美分)。