2017-02-08 9 views
0

お客様に製品登録を請求しようとしています。私はこのチュートリアルupskillcourses.comに従ってきました。これはサブスクリプションを設定します。私はただ製品の料金を作成しようとしています。Railsストライプインテグレーションでアクティブカードエラーが発生しない

私はこのerrorを得続ける:
Stripe::CardError in Roadregistrations::RegistrationsController#create Cannot charge a customer that has no active card

私はセットアップstripe.jsファイルました:

アプリ/資産/ JavaScriptのは/それはtokenように思える

/* global $, Stripe */ 
//Document ready. 
$(document).on('turbolinks:load', function(){ 
var theForm = $('#payment-form'); 
var submitBtn = $('#form-submit-btn'); 

//Set Stripe public key. 
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content')); 
//When user clicks form submit btn, 
submitBtn.click(function(event){ 
//prevent default submission behavior. 
event.preventDefault(); 
submitBtn.val("Processing").prop('disabled', true); 
//Collect the credit card fields. 
var ccNum = $('#card_number').val(), 
    cvcNum = $('#card_code').val(), 
    expMonth = $('#card_month').val(), 
    expYear = $('#card_year').val(); 
//Use Stripe JS library to check for card errors. 
var error = false; 
//Validate card number. 
if(!Stripe.card.validateCardNumber(ccNum)) { 
    error = true; 
    alert('The credit card number appears to be invalid'); 
} 
//Validate CVC number. 
if(!Stripe.card.validateCVC(cvcNum)) { 
    error = true; 
    alert('The CVC number appears to be invalid'); 
} 
//Validate expiration date. 
if(!Stripe.card.validateExpiry(expMonth, expYear)) { 
    error = true; 
    alert('The expiration date appears to be invalid'); 
} 
if (error) { 
    //If there are card errors, don't send to Stripe. 
    submitBtn.prop('disabled', false).val("Register and Pay"); 
} else { 
    //Send the card info to Stripe. 
    Stripe.createToken({ 
    number: ccNum, 
    cvc: cvcNum, 
    exp_month: expMonth, 
    exp_year: expYear 
    }, stripeResponseHandler); 
} 
return false; 
}); 

//Stripe will return a card token. 
function stripeResponseHandler(status, response) { 
//Get the token from the response. 
var token = response.id; 
//Inject the card token in a hidden field. 
theForm.append($('<input type="hidden" name="user[stripe_card_token]">').val(token)); 
//Submit form to our Rails app. 

theForm.get(0).submit(); 
} 
}); 

ではありませんフォームと共に提出されています。

ない私は私のusers_controller.rbにこれらの両方が必要な場合は必ず:

# Only allow a trusted parameter "white list" through. 
def roadregistration_params 
    params.require(:user).permit(:first_name, :last_name, :company, :street, :city, :state, :zip, :email, :phone, :roadshowcity, :stripe_card_token, :comments) 
end 

protected 
    def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:stripe_card_token, :password, :password_confirmation, :email, :first_name, :last_name, :company, :street, :city, :state, :zip, :phone, :roadshowcity, :comments) } 
    end 

その後、私は私のuser modelでこれをしている:あなただけにカードをリンクする必要があり

attr_accessor :stripe_card_token 
# If user passes validations (email, pass, etc.), 
# Call stripe and tell stripe to set up a subscription 
def save_with_registration 
    if valid? 
    @product_price = Objective.find(objective_id) 
     customer = Stripe::Customer.create(email: email, card: stripe_card_token, description: stripe_card_token.to_s) 

     charge = Stripe::Charge.create(
     :customer => customer.id, 
     :amount => 9500, 
     :currency => "usd", 
     :description => "Roadshow Registration" 
    ) 
     self.stripe_customer_token = customer.id 
     save! 
    end 
    end 

customer = Stripe::Customer.create(email: '[email protected]') => #<Stripe::Customer:0x3ffd3a10e024 id=cus_A5CWbyto5ugmju> JSON: { "id": "cus_A5CWbyto5ugmju", "object": "customer", "account_balance": 0, "created": 1486585998, "currency": null, "default_source": null, "delinquent": false, "description": null, "discount": null, "email": "[email protected]", "livemode": false, "metadata": {}, "shipping": null, "sources": {"object":"list","data":[],"has_more":false,"total_count":0,"url":"/v1/customers/cus_A5CWbyto5ugmju/sources"}, "subscriptions": {"object":"list","data":[],"has_more":false,"total_count":0,"url":"/v1/customers/cus_A5CWbyto5ugmju/subscriptions"} }

答えて

0

顧客をストライプ上に作成してから請求する前に:

customer = Stripe::Customer.create(email: email) 
customer.sources.create(card: stripe_card_token) # <-- this 
charge = Stripe::Charge.create(.. 

そして、customerオブジェクトにstripe_card_tokenを送信しないように助言します。

バージョンが2015-02-18より古い場合は、sourcescardsに置き換えてください。

+0

ありがとうございましたが、それは私に「#Stripe :: Customer: 'のための'未定義のメソッド 'cards '」というエラーを与えるだけです。また、ストライプAPIドキュメントを見ると、 'customer.cards'オブジェクトはありません。 – Corey

+0

'customer = Stripe :: Customer.create(email: '[email protected]')'の結果をあなたのレールコンソールに投稿できますか? –

+0

私は私のstackoverflow質問に出力を追加しました。 – Corey

0

Turbolinksがapp/assets/javascripts/application.jsファイルに読み込まれていませんでした。その問題を修正すると、ストライプのJavascriptが実行され、stripe_card_tokenが渡されました。

関連する問題