2014-06-11 45 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支持工作。