2014-09-11 70 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

您應該將單選按鈕放在窗體的內部(應該只有一個窗體),然後在控制器上獲取該值(您可能希望將值設置爲美分,否則將其轉換爲控制器中的美分)。