Полоса не вернет токен (тестовый режим)
Использование Django 1.9 и Stripe 1.35.0. Я пробую Stripe в проекте (stripe.js, НЕ 'checkout'), однако Stripe не вернет токен. Я проверил свои STRIPE_SECRET_KEY & STRIPE_PUBLISHABLE_KEY, чтобы убедиться, что они совпадают. Я в основном скопировал HTML-код непосредственно с веб-сайта Stripe вместе с соответствующим javascript ( https://stripe.com/docs/custom-form).
На мой взгляд, когда я использую request.POST['stripeToken']
Я получаю MultiValueDictKeyError "stripeToken". Если я использую request.POST.get('stripeToken')
Я получаю ошибку InvalidRequestError в /orders/checkout Request req_8ecvcXQcwmM1lk: Должен предоставить источник или клиента. Другими словами, он не предоставляет токен для создания клиента (или Charge).
Очевидно, что я делаю что-то не так, однако я не могу найти это. Я посмотрел, какие примеры я могу найти (большинство из них несколько лет) и документы. Любая помощь приветствуется..Спасибо.
#views.checkout
def checkout(request):
publishable_key = settings.STRIPE_PUBLISHABLE_KEY
if request.method == "POST":
stripe.api_key = settings.STRIPE_SECRET_KEY
token = request.POST.get('stripeToken')
#token = request.POST['stripeToken']
print token
customer = stripe.Customer.create(description='test', source=token)
print customer
stripe.Charge.create(amount=500, currency='usd', source=token, description='test')
return redirect('orders:thanks.html')
context = {'publishable_key': publishable_key}
return render(request, 'orders/checkout.html', context)
#checkout.html
<script type="text/javascript" src="https://js.stripe.com/v2/"></script>
<script type="text/javascript">
Stripe.setPublishableKey('{{ publishable_key }}');
function stripeResponseHandler(status, response) {
// Grab the form:
var $form = $('#payment-form');
if (response.error) { // Problem!
// Show the errors on the form:
$form.find('.payment-errors').text(response.error.message);
$form.find('.submit').prop('disabled', false); // Re-enable submission
} else { // Token was created!
// Get the token ID:
var token = response.id;
// Insert the token ID into the form so it gets submitted to the server:
$form.append($('<input type="hidden" name="stripeToken">').val(token));
// Submit the form:
$form.get(0).submit();
}
};
$(function() {
var $form = $('#payment-form');
$form.submit(function(event) {
// Disable the submit button to prevent repeated clicks:
$form.find('.submit').prop('disabled', true);
// Request a token from Stripe:
Stripe.card.createToken($form, stripeResponseHandler);
// Prevent the form from being submitted:
return false;
});
});
</script>
{% endblock %}
{% block content %}
<h3 class="text-center">Credit Card Payment</h3>
<div class="container">
<div class="row">
<form method="post" action="." id="checkout-form">
{% csrf_token %}
<div class="form-group">
<label class="control-label" for="card">Card</label>
<div class="controls">
<input type="text" id="card" class="form-control" data-stripe="number" />
</div>
</div>
<div class="form-group">
<label class="control-label" for="">Expiration (MM/YYYY)</label>
<div class="row">
<div class="col-xs-2">
<input type="text" size="2" data-stripe="exp-month" class="form-control" />
</div>
<div class="col-xs-2">
<input type="text" size="4" data-stripe="exp-year" class="form-control" />
</div>
</div>
</div>
<div class="form-group">
<label class="control-label" for="cvc">CVC</label>
<div class="controls">
<input type="text" id="cvc" size="4" class="form-control" data-stripe="cvc" />
</div>
</div>
<div class="form-group">
<div class="controls">
<input type="submit" value="Checkout" class="btn btn-primary" />
</div>
</div>
</form>
</div>
</div>
{% endblock %}
And in settings.py
# Stripe Settings:
STRIPE_SECRET_KEY = 'sk_test_XVDF17ppRvcOciF1xjQryhDX'
STRIPE_PUBLISHABLE_KEY = 'pk_test_RQjZcRmXjpVHfZv5x4KlI6wT'
1 ответ
Вам нужно пройти Customer
идентификатор для Charge
конечная точка, вместо stripeToken
:
customer = stripe.Customer.create(description='test', source=token)
stripe.Charge.create(customer=customer.id, amount=500, currency='usd', description='test')
Подробнее здесь: Сохранение данных кредитной карты на потом
Кроме того, вы должны использовать Ajax или лучший метод, чем этот, чтобы отправить stripeToken
к вашему заявлению:
// Get the token ID:
var token = response.id;
// Insert the token ID into the form so it gets submitted to the server:
$form.append($('<input type="hidden" name="stripeToken">').val(token));
// Submit the form:
$form.get(0).submit();
Это отправит всю информацию CC на ваш сервер. Вы должны что-то вроде:
// Get the token ID:
var token = response.id;
$.ajax({
url: '/api/charge-customer',
type: 'POST',
data: {stripeToken: token},
success: function (data) {
Alert("You have been charged.");
},
error: function (data) {
Alert("Server Error.");
}
});