2014-06-11 46 views
-1

我創造了stripe_card_token:無法創建/生成stripe_card_token

Stripe.createToken(card, charge.handleStripeResponse) 

在我charges.js.coffee文件

jQuery -> 
    Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content')) 
    charge.setupForm() 

charge = 
    setupForm: -> 
    $('#new_charge').submit -> 
     $('input[type=submit]').attr('disabled', true) 
     if $('#card_number').length 
     charge.processCard() 
     false 
     else 
     true 

    processCard: -> 
    card = 
     number: $('#card_number').val() 
     cvc: $('#card_code').val() 
     expMonth: $('#card_month').val() 
     expYear: $('#card_year').val() 
    Stripe.createToken(card, charge.handleStripeResponse) 

    handleStripeResponse: (status, response) -> 
    if status == 200 
     $('#charge_stripe_card_token').val(response.id) 
     $('#new_charge')[0].submit() 
    else 
     $('#stripe_error').text(response.error.message) 
     $('input[type=submit]').attr('disabled', false) 

這是我的收費模式:

class Charge < ActiveRecord::Base 

    attr_accessor :stripe_card_token 

    belongs_to :contest 
    belongs_to :user 

    def save_with_payment(charge) 
     if valid? 
     charge = Stripe::Charge.create(
      :amount => (charge.amount.to_i)*100, 
      :currency => "usd", 
      :card => stripe_card_token) 
     self.stripe_charge_token = charge_id 
     save! 
     end 
    rescue Stripe::InvalidRequestError => e 
     logger.error "Stripe error while creating customer: #{e.message}" 
     errors.add :base, "There was a problem with your credit card." 
     false 
    end 

end 

但是,當我點擊捐贈按鈕時,我收到通知(&重定向到root_path),如上所述在我的控制器:"Transaction was not able to be recorded"

這是我的費用控制:

class ChargesController < ApplicationController 

    def new 
     @contest = Contest.find(params[:id]) 
     @charge = Charge.new(amount: params[:amount]) 
    end 

    def create 
     @charge = Charge.new(charges_params) 
     if @charge.save_with_payment(@charge) 
     redirect_to root_path, :notice => "Contribution was recorded succesfully!" 
     else 
     redirect_to root_path, :notice => "Transaction was not able to be recorded" 
     end 
    end 

    def charges_params 
     params.require(:charge).permit(:stripe_card_token, :contest_id, :user_id, :amount) 
    end 

end 

當我看我的日誌我得到這個錯誤:

Started POST "/charges" for 127.0.0.1 at 2014-06-11 01:10:29 -0700 
Processing by ChargesController#create as HTML 
    Parameters: {"utf8"=>"√", "authenticity_token"=>"9bqk2Q6HBM1ehL4JPgncNQ3gnP0X1nQK2y6ENm8Yb8g=", "c 
harge"=>{"contest_id"=>"31", "user_id"=>"", "amount"=>"40", "stripe_card_token"=>""}, "card_number"= 
>"4242424242424242", "card_code"=>"419", "button"=>""} 
Stripe error while creating customer: You passed an empty string for 'card'. We assume empty values 
are an attempt to unset a parameter; however 'card' cannot be unset. You should remove 'card' from y 
our request or supply a non-empty value 
Redirected to http://localhost:3000/ 
Completed 302 Found in 502ms (ActiveRecord: 0.0ms) 


Started GET "/" for 127.0.0.1 at 2014-06-11 01:10:30 -0700 

出於某種原因,磁條卡令牌不是生成...

這是我的收費/新形式:

<% content_for :head do %> 
    <%= tag :meta, :name => "stripe-key", :content => STRIPE_PUBLIC_KEY %> 
<% end %> 
<%= form_for @charge, :html => { :class => 'form' } do |f| %> 
    <div class="form-inputs"> 
     <div class="row"> 
      <%= f.hidden_field :contest_id, value: @contest.id %> 
      <%= f.hidden_field :user_id %> 
      <%= f.hidden_field :amount %> 
      <%= f.hidden_field :stripe_card_token %> 
      <div class="small-12 medium-6 large-2 columns"> 
       <%= f.label "Amount:", class: "text-right" %> 
      </div> 
      <div class="small-12 medium-6 large-10 columns" style="margin-bottom: 0.5rem; margin-top: 0.5rem;"> 
       <%= number_to_currency(@charge.amount, :unit => "$") %> 
      </div> 
       <div class="small-12 medium-6 large-2 columns"> 
       <%= label_tag :card_number, "Credit Card Number:", class: "text-right" %> 
       </div> 
       <div class="small-12 medium-6 large-10 columns"> 
       <%= text_field_tag :card_number %> 
       </div> 
       <div class="small-12 medium-6 large-2 columns"> 
       <%= label_tag :card_code, "Security Code on Card (CVV):", class: "text-right" %> 
       </div> 
       <div class="small-12 medium-6 large-10 columns end"> 
       <%= text_field_tag :card_code %> 
       </div> 
       <div class="small-12 medium-6 large-2 columns"> 
       <%= label_tag :card_month, "Card Expiration:", class: "text-right" %> 
       </div> 
       <div class="small-6 medium-3 columns"> 
       <%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %> 
       </div> 
       <div class="small-6 medium-3 columns"> 
       <%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %> 
       </div> 

      <div id="stripe_error"> 
       <noscript>JavaScript is not enabled and is required for this form. First enable it in your web browser settings.</noscript> 
      </div> 

     </div> 
     <div class="row"> 
      <div class="form-actions small-9 small-offset-2 columns"> 
       <%= button_tag :type => "button", :class => "radius" do %> 
        <%= link_to "Back", @contest, :style => "color: white" %> 
       <% end %> 
       <%= f.button :Donate, :class => "radius" %> 
      </div> 
     </div> 
    </div> 
<% end %> 
<% content_for :js do %> 
    <%= javascript_include_tag "https://js.stripe.com/v1", "application" %> 
    <%= javascript_include_tag asset_path("stripe/stripe.js"), "application" %> 
<% end %> 

我在佈局的頭部分以下內容:

<%= javascript_include_tag "https://js.stripe.com/v1/", "application", "data-turbolinks-track" => true %> 
    <%= csrf_meta_tags %> 

    <%= tag :meta, :name => "stripe-key", :content => STRIPE_PUBLIC_KEY %> 

這是我的費用表:

​​

在我的配置/初始化/ stripe.rb我:

Stripe.api_key = "sk_testdfkdlfjgkdlsuEvpipr2umoKu9f" 
STRIPE_PUBLIC_KEY = "pk_testdfgkdfgpud6JHfCvuRHnvpuLPo" 

我在做什麼錯?

+2

您的控制器收到信用卡信息的事實已經是一個紅旗......您的服務器永遠無法訪問該數據 - 它應該直接由js傳送給Stripe。我建議你實現一個更符合條紋文檔的表單。 https://stripe.com/docs/tutorials/forms 此外,「@ charge.save_with_payment(@charge)」你傳遞一個對象到對象本身的方法? – SteveTurczyn

+0

@SteveTurczyn我需要爲我的用例做一個變量,他們的文檔中的示例表單不適用於我的用例。 – user3597950

+0

但是當你試圖生成令牌時,你不需要這個數量。當您使用已經生成的令牌在您的應用中產生費用時,會在稍後提供。生成令牌的表單不需要或不關心金額。 – SteveTurczyn

回答

0

因此,首先,如前所述,您需要確保您的表單沒有信用卡詳細信息的名稱屬性,以便該信息不會觸及您的服務器。您只需要服務器上的令牌,而不是信用卡號碼,CVC或到期日期。第二,爲了調試這個,我會停止提交表單(在Stripe token請求之後)並且檢查隱藏的輸入是否被Stripe中的一個標記填充。然後我確認令牌正在到達服務器。

希望有幫助! Larry

PS我在Stripe支持工作。