'No such token' ошибка 400 платежного запроса к Stripe

На сайте API STRIPE мне сообщают, что в LOGS произошла ошибка: По какой именно причине я получаю ошибку 400 при вводе номеров тестовых карт и нажатии кнопки "Подтвердить"? Это сообщение содержит все детали моей ошибки. Я приложил код, в котором производится оплата. Обработка токенов и т.д.

POST /v1/charges
Status
400 ERR
ID
req_GKbBUprcIuSQ0X
Time
5/25/24, 1:09:58 PM
IP address
151.249.163.206
API version
2024-04-10
Source
Stripe/v1 PythonBindings/2.37.2
Idempotency
Key — badc22f3-4989-46e8-aec6-35347aa48d10

resource_missing - source
No such token: 'tok_1PKHY1IRI3YGNQKDocTdMkPu'

Was this useful?

Yes

No
{
  "source": "tok_1PKHY1IRI3YGNQKDocTdMkPu",
  "amount": "4400",
  "currency": "usd"
}
Response body
{
  "error": {
    "code": "resource_missing",
    "doc_url": "https://stripe.com/docs/error-codes/resource-missing",
    "message": "No such token: 'tok_1PKHY1IRI3YGNQKDocTdMkPu'",
    "param": "source",
    "request_log_url": "https://dashboard.stripe.com/test/logs/req_GKbBUprcIuSQ0X?t=1716631798",
    "type": "invalid_request_error"
  }
}
Request POST body
{
  "source": "tok_1PKHY1IRI3YGNQKDocTdMkPu",
  "amount": "4400",
  "currency": "usd"
}

Мои API-токены

STRIPE_SECRET_KEY=sk_test_51PKFiB03rDhpU9syC7RuPemfhPC6Z5IZvxaKWRR5MajKEE3tvE58VrbZjxp3y56VoGrC2QLkARr95QVuDpmmu8uv00TP46EZQM STRIPE_PUBLISHABLE_KEY=pk_test_51PKFiB03rDhpU9syvWsl9Mvlt0XLdWaDI9a8fdolFlN9SXcUSxPhd9rtolZSUKIbBikfuWoeYZkPrdxFvf1T3Pmw00DGaQtOPA

VIEWS.PY

class PaymentView(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        order = Order.objects.filter(user=self.request.user, ordered=False).first()
        return render(self.request, 'checkout/payment.html', {'order': order})

    def post(self, *args, **kwargs):
        order = Order.objects.filter(user=self.request.user, ordered=False).first()
        token = self.request.POST.get('stripeToken')
        try:
            charge = stripe.Charge.create(
              amount=round(float(order.get_total_amount() * 100)),
              currency="usd",
              source=token
            )
        except stripe.error.CardError:
            messages.error(self.request, 'Payment could not be made')
            return redirect('products:home-page')
        except Exception:
            messages.error(self.request, 'Internal server error')
            return redirect('products:home-page')

        payment = Payment(
            user=self.request.user,
            stripe_id=charge.id,
            amount=order.get_total_amount()
        )
        payment.save()
        order.order_id = get_random_string(length=20)
        order.payment = payment
        order.ordered = True
        order.save()

        messages.info(self.request, 'Payment was successfully issued')
        return redirect('checkout:checkout-success')

JS-файл

const stripe = Stripe('pk_test_51PKFiB03rDhpU9syvWsl9Mvlt0XLdWaDI9a8fdolFlN9SXcUSxPhd9rtolZSUKIbBikfuWoeYZkPrdxFvf1T3Pmw00DGaQtOPA');
const elements = stripe.elements();

// Custom styling can be passed to options when creating an Element.
const style = {
  base: {
    // Add your base input styles here. For example:
    fontSize: '16px',
    color: "#32325d",
  },
};

// Create an instance of the card Element.
const card = elements.create('card', {style});

// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');

card.addEventListener('change', ({error}) => {
  const displayError = document.getElementById('card-errors');
  if (error) {
    displayError.textContent = error.message;
  } else {
    displayError.textContent = '';
  }
});

// Create a token or display an error when the form is submitted.
const form = document.getElementById('payment-form');
form.addEventListener('submit', async (event) => {
  event.preventDefault();

  const {token, error} = await stripe.createToken(card);

  if (error) {
    // Inform the customer that there was an error.
    const errorElement = document.getElementById('card-errors');
    errorElement.textContent = error.message;
  } else {
    // Send the token to your server.
    stripeTokenHandler(token);
  }
});

const stripeTokenHandler = (token) => {
  // Insert the token ID into the form so it gets submitted to the server
  const form = document.getElementById('payment-form');
  const hiddenInput = document.createElement('input');
  hiddenInput.setAttribute('type', 'hidden');
  hiddenInput.setAttribute('name', 'stripeToken');
  hiddenInput.setAttribute('value', token.id);
  form.appendChild(hiddenInput);

  // Submit the form
  form.submit();
}

В этом сообщении содержатся все подробности моей ошибки. Я приложил код, в котором производится оплата. Обработка токенов и т. д. help

Как следует из сообщения об ошибке, он не может найти tok_1PKHY1IRI3YGNQKDocTdMkPu на вашем аккаунте Stripe. Вы уверены, что этот токен был создан с тем же публикуемым ключом, который вы использовали в вашем JS-файле? Я рекомендую проверить / записать в журнал публикуемые ключи, используемые для создания токена, и идентификатор токена

Как указано в комментарии, вы никогда не должны делиться своими секретными ключами API, независимо от того, тестовый это ключ или ключ реального режима. Вы должны немедленно свернуть свой ключ тестового режима: https://stripe.com/docs/keys#rolling-keys

Кроме того, Tokens и Charges - это устаревшие API, вместо них следует использовать PaymentMethods и PaymentIntents. См. https://docs.stripe.com/payments/payment-intents/migration/charges о различиях между Charges и PaymentIntents.

Вы также можете обратиться к https://docs.stripe.com/payments/quickstart за готовыми к использованию образцами.

Вернуться на верх