'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 за готовыми к использованию образцами.