Streifen: Fehlermeldungen beim Erstellen eines Kunden - &/oder Charge - Ruby on Rails
Ich die Umsetzung Stripe in meiner Rails-app - & Holen Sie sich eine Invalid Token Fehler, wenn ich Sie laden sich das Anmeldeformular - ich habe noch nicht eingereicht Kundendaten noch. Ich meist folgte der http://railscasts.com/episodes/288-billing-with-stripe tutorial. Ich machte ein paar änderungen, denn es war etwas unvollständig.
Bücher/zeigen.html-Code.erb ist die Seite, wo ich einen link auf das Formular:
<b>Title:</b> <%= @book.title %> </p>
<b>Author:</b> <% authorid = @book.author %></p>
<%= @book.id %>
<%= link_to "Buy Now", new_purchase_path(:book_id => @book.id) %>
Käufe/neue.html-Code.erb ist, wo der Benutzer füllt info. Wenn dies lädt, erhalte ich die Invalid-Token Fehler:
<%= form_for @purchase do |f| %>
<% if @purchase.errors.any? %>
<%= pluralize(@purchase.errors.count, "error") %> prohibited this purchase from being saved.
<% @purchase.errors.full_messages.each do |msg| %>
<%= msg %>
<% end %>
<% end %>
<%= f.hidden_field :stripe_card_token %>
<% if @purchase.stripe_card_token.present? %>
Credit card has been provided.
<% else %>
<%= label_tag :card_number, "Credit Card Number" %>
<%= text_field_tag :card_number, nil, name: nil %><p>
<%= label_tag :card_code, "Security Code on Card (CVV)" %>
<%= text_field_tag :card_code, nil, name: nil %><p>
<%= label_tag :card_month, "Card Expiration" %>
<%= select_month nil, {add_month_numbers: true}, {name: nil, id: "card_month"} %>
<%= select_year nil, {start_year: Date.today.year, end_year: Date.today.year+15}, {name: nil, id: "card_year"} %>
<% end %>
<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>
<%= f.submit "Purchase" %>
<% end %>
Einkäufe.js.Kaffee ist so ziemlich das gleiche wie im tutorial. Ich fügte hinzu, ein paar Warnungen. Der status nach meinem Stripe dashboard 402. Es ist eine POST /v1/tokens Fehler und die Reaktionszeit Körper:
error:
type: "card_error"
message: "This card number looks invalid"
param: "number"
Einkäufe.js.Kaffee:
jQuery ->
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
purchase.setupForm()
purchase =
setupForm: ->
$('#new_purchase').submit ->
$('input[type=submit]').attr('disabled', true)
if $('#card_number').length
purchase.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, purchase.handleStripeResponse)
handleStripeResponse: (status, response) ->
if status == 200
alert('This token can still be charged.')
alert(response.id)
$('#purchase_stripe_card_token').val(response.id)
$('#new_purchase')[0].submit()
else
alert(response.error.message)
alert('The token was invalid, or has been used.')
$('#stripe_error').text(response.error.message)
$('input[type=submit]').attr('disabled', false)
Habe ich versucht, ein paar Versionen von meinem Kauf.rb Modell, wie Kommentare aus den Streifen::Charge-Funktion, aber bekomme immer noch die 402 Token-Fehler. Aber die Schaffung der Kunde erfolgreich ist (code 200).
class Purchase < ActiveRecord::Base
attr_accessible :stripe_customer_token, :author_id, :book_id
attr_accessor :stripe_card_token
belongs_to :book
def save_with_payment
if valid?
customer = Stripe::Customer.create(
:description => "customer email",
:card => stripe_card_token
)
self.stripe_customer_token = customer.id
# charge = Stripe::Charge.create( - this code doesn't work either
# :amount => 1000,
# :currency => "usd",
# :card => stripe_card_token,
# :description => "book title"
# )
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
Den Fehler bekomme ich, wenn ich entfernen Sie den Streifen::Charge-code ist:
Streifen::CardError in PurchasesController#erstellen
Nicht laden ist ein Kunde, der keine aktive Karte
- Und die create-Methode in meinem purchases_controller.rb
def create
@purchase = Purchase.new(params[:purchase])
if @purchase.save_with_payment
redirect_to @purchase, :notice => "Thank you for purchasing this book!"
else
render :new
end
end
Hier ist meine neue Methode in der purchases_controller.rb:
def neue
book = Book.find(params[:book_id]) @purchase = book.purchases.build
Ende
ABER wenn ich auf den Zurück-button nach dem Absenden des Kaufs (zurück zu gehen, um den Kauf/neue.html-Code.erb Seite), eine ZWEITE 'kaufen' eingetragen ist, in meiner Datenbank und den code für das POST-Token in meinem Streifen-log 200 (pass)!!!
Hier ist der javascript-zusammengestellt von coffeescript:
(function() {
var Kauf;
jQuery(function() {
Streifen.setPublishableKey($('meta[name="stripe-key"]').attr('content'));
zurück kaufen.setupForm();
});
Einkauf = {
setupForm: function() {
$('#new_purchase').submit(function() { return $('input[type=submit]').attr('disabled', true); }); if ($('#card_number').length) { purchase.processCard(); return false; } else { return true; }
},
processCard: function() {
var card; card = { number: $('#card_number').val(), cvc: $('#card_code').val(), expMonth: $('#card_month').val(), expYear: $('#card_year').val() }; return Stripe.createToken(card, purchase.handleStripeResponse);
},
handleStripeResponse: function(status, response) {
if (status === 200) { alert('This token can still be charged.'); alert(response.id); $('#purchase_stripe_card_token').val(response.id); return $('#new_purchase')[0].submit(); } else { alert(response.error.message); alert('The token was invalid, or has been used.'); $('#stripe_error').text(response.error.message); return $('input[type=submit]').attr('disabled', false); }
}
};
}).call(this);
- Haben Sie versucht vorbei
:customer => customer
zuStripe::Charge.create
statt:card
? - Ja. Ich ging :Kunden => Kunden.id-und das hat nicht funktioniert entweder. Es scheint, dass die app Absenden der info beim laden der Seite, bevor Sie alle info eingegeben.
- Könntest du posten das javascript, das ausgegeben wird von Ihrem coffeescript?
- Diese !@#$%^&* editor nicht mein 'code' schauen, wie code so, ich werde fügen Sie den code oben.
- Ich sehe das problem. Der Einzug in Ihre CoffeeScript (speziell die
setupForm
Funktion) ist falsch. Cross-check mit den Railscast episode. Werde ich nach einer richtigen Antwort, wenn ich Zeit habe heute Abend. - Ich dachte, Sie bliesen Rauch mich, aber ich fand heraus, dass das Leerzeichen ein Problem in coffeescript. Dass meine Feste Einreichen-mit-laden. Aber ich bekomme immer noch Fehler mit Streifen::Kostenlos, wenn ich kommentieren Sie diesen code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie bereits in meinem Kommentar oben, der Einzug Ihres CoffeeScript ist leicht aus (whitespace signifikant ist in CS). Es ist kein syntax-Fehler, so dass es noch kompiliert, aber der generierte JS ist nicht, was Sie beabsichtigen. Hier ist der code richtig eingerückt.
In der JS, die Sie geschrieben, die bedingte
if ($('#card_number').length)
existiert außerhalb der anonymen Funktion an das submit-Ereignis. Das bewirkt, dass die bedingte ausgeführt, sobald die Seite geladen wird, sondern wenn das Formular abgeschickt wird. Da gibt es nichts in der '#card_number' input, wenn die Seite anfangs geladen, die bedingte alternative (else
Zweig) wird im hintergrund ausgeführt. Hier ist, was die JS Aussehen sollte:Das Verhalten, das Sie sehen, wenn die Navigation "zurück", um die neue Seite ist das Ergebnis von der Seite laden mit Eingang in die '#card_number' - Feld (Ausführung der
processCard
- Funktion), das ist, was du willst, nur nicht wenn Sie es wollen.Wenn meine Spekulationen richtig sind, fixieren den Einzug in Ihre CoffeeScript ist die Lösung.
:stripe_card_token
zu denattr_accessible
rufen Sie in der Kauf-Modell. Sie können auch entfernen:stripe_customer_token
von derattr_accessible
nennen. Zu sehen, was params einzureichen sind die create-Aktion wäre sehr hilfreich beim Debuggen weiter. Sie können Sie von Ihrem server-log, oderraise params.to_yaml
in Ihre Einkäufe controller create-Aktion.:stripe_card_token
ist nicht ein Feld in meiner Datenbank, aber:stripe_customer_token
ist. Nach dem Streifen railscast, Sie sind eigentlich nicht zum speichern von:stripe_card_token
in Ihrer Datenbank, sondern senden Sie es direkt zu Streifen.raise params.to_yaml
gab mir einen Absturz mit Laufzeitfehler in PurchasesController#erstellen:stripe_card_token
ist nicht immer geschickt zu Streifen, die entweder dasStripe::Customer
oderStripe::Charge
Funktionen. Ich vermute, es ist nicht immer vorgelegt/durch Käufe/neue.html-Code.erb. Ich bin mir nicht ganz sicher, was Einkäufe.js.Kaffee passt, aber ich denke, es sollte reichen die token Käufe/neu und ich Frage mich, wenn es nicht ist..
- Streifen:: - Laden` funktioniert jetzt! Aber nicht, wenn ich behaupte, dass SOWOHL eine Kunden-und eine Karte Wert. Vielleicht ist es angeblich so sein, da ich auch mitStripe::Customer
.Stripe::Customer
wird verwendet, um ordnen Sie einen Benutzer und Ihre Karte mit einem Abonnement-plan. Scheint, dass Sie wollen, stellen Sie eine einmalige Gebühr für die Karte. In dem Fall Streifen::Kostenlos ist, was Sie wollen.Ist etwas, was dem Absenden des Formulars auf die Seite laden? (Vielleicht eine fehlerhafte jQuery-Anfrage von einem anderen Teil der app?) Ich fand, dass diese Seite mir sehr geholfen beim einrichten /testen Stripe: https://stripe.com/docs/testing
UPDATE
Versuchen, diese zuerst
und wenn das nicht funktioniert, ändern Sie Ihre form zu