Я следую за кастом Rails для реализации биллинга по подписке. Это здесь:
http://railscasts.com/episodes/288-billing-with-stripe
Мой код практически идентичен, хотя я передаю некоторые дополнительные поля в Stripe. Проблема в том, что сообщение об ошибке в javascript ВСЕГДА отображает сообщение об ошибке, когда нажимается кнопка отправки ... даже при успешных расходах. Я не уверен, что Strip возвращает что-то, что вызывает ошибку, или есть проблема с JS.
jQuery ->
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'))
subscription.setupForm()
subscription =
setupForm: ->
$('#new_membership').submit ->
$('input[type=submit]').attr('disabled', true)
if $('#card_number').length
subscription.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, subscription.handleStripeResponse)
handleStripeResponse: (status, response) ->
if status == 200
$('#membership_stripe_card_token').val(response.id)
$('#new_membership')[0].submit()
else
$('#stripe_error').text(response.error.message)
$('input[type=submit]').attr('disabled', false)
Это пример, который полоса дает для обработки ошибок. Они переворачивают процесс и сначала проверяют на ошибки:
function stripeResponseHandler(status, response) {
if (response.error) {
...
//show the errors on the form
$(".payment-errors").html(response.error.message);
} else {
var form$ = $("#payment-form");
// token contains id, last4, and card type
var token = response['id'];
// insert the token into the form so it gets submitted to the server
form$.append("<input type='hidden' name='stripeToken' value='" + token + "'/>");
// and submit
form$.get(0).submit();
}
}
ОБНОВЛЕНИЕ: Итак, я могу рассказать вам, что происходит, но не совсем, почему или как это исправить.
Я добавил оператор журнала консоли и теперь вижу, что handleStripeResponse
вызывается дважды, один раз, когда пользователь нажимает на submit, и он возвращает 200
, затем кажется снова (возможно, потому что форма должна отправлено в приложение Rails для фактической обработки? и он возвращает 0
, который выдает сообщение об ошибке. НО - поскольку Rails теперь обрабатывает серверную часть обработки, плата проходит.
Вот скомпилированный JS, если это поможет:
(function() {
var subscription;
jQuery(function() {
Stripe.setPublishableKey($('meta[name="stripe-key"]').attr('content'));
return subscription.setupForm();
});
subscription = {
setupForm: function() {
return $('#new_membership').submit(function() {
$('input[type=submit]').attr('disabled', true);
if ($('#card_number').length) {
subscription.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, subscription.handleStripeResponse);
},
handleStripeResponse: function(status, response) {
if (status === 200) {
$('#membership_stripe_card_token').val(response.id);
return $('#new_membership')[0].submit();
} else {
$('#stripe_error').text(response.error.message);
return $('input[type=submit]').attr('disabled', false);
}
}
};
}).call(this);