Полоса не вернет токен (тестовый режим)

Использование 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.");
    }
});
Другие вопросы по тегам