Ошибка 'Нет такого токена' при отправке запроса на оплату в Stripe
Я настраиваю прием платежей с использованием API Stripe, чтобы пользователь мог войти в свою учетную запись Stripe на iPad и принимать платежи от любого. Для этого я использую Stripe Connect для входа и сохранения идентификатора учетной записи, затем использую STPPaymentCardTextField
для получения данных кредитной карты. С помощью iOS SDK Stripe я создаю токен, отправляя данные карты (с тестовой информацией карты - 4242...) через метод createTokenWithCard
. Этот процесс проходит успешно, и токен возвращается.
На этом этапе мне нужно отправить токен вместе с идентификатором целевой учетной записи (полученным после входа пользователя) и другой информацией (валюта, сумма и т.д.) на свой собственный сервер для обработки платежа в Stripe. Я убедился, что информация отправляется и передается в Stripe, но Stripe возвращает ошибку:
{ type: 'invalid_request_error',
message: 'No such token: tok_13vxes2eZkKYli2C9bHY1YfX',
param: 'source',
statusCode: 400,
requestId: 'req_7AIT8cEasnzEaq' },
requestId: 'req_7AIT8cEasnzEaq',
statusCode: 400 }
Если мы отправляем информацию кредитной карты напрямую, избегая токена полностью, платеж проходит успешно. Кажется, что что-то не так с этим токеном, и мы не можем понять, почему он не работает. Что может идти не так в этом случае?
Вот код, который я использую для создания токена:
[[STPAPIClient sharedClient] createTokenWithCard:card completion:^(STPToken *token, NSError *error) {
// Отправить tokenId и другую информацию на конечную точку 'charge' ниже
}
На стороне NodeJS код выглядит так:
app.post('/charge', (req, res, next) => {
stripe.charges.create({
amount: req.body.amount,
currency: req.body.currency,
source: req.body.token,
description: req.body.description,
destination: req.body.destination
}, (err, charge) => {
if (err) return next(err)
res.json(charge)
})
})
Буду признателен за любые подсказки о том, что может быть не так с токеном или в процессе обработки платежа.
4 ответ(ов)
Я сталкивался с аналогичной проблемой в своей тестовой среде. Ошибка, которую я допускал, заключалась в том, что я добавлял токен, полученный от Stripe, следующим образом: source: 'tok_18nnwSJ6tVEvTdcVs3dNIhGs'. Но для тестовой среды нужно использовать source: 'tok_visa'.
Вот список тестовых источников, предоставленный Stripe: перейдите по ссылке.
Это позволило мне создать клиента. Надеюсь, что это поможет и другим!
Принимаемый ответ не работает для меня. Я использую правильные ключи для клиента и сервера, но проблема все еще существует. Я отправляю источник с iOS на сервер, и, основываясь на примере Stripe RocketRides, отправляю ID источника кредитной карты, который выглядит как "card_xxx", и это не сработает. Вам нужно будет добавить атрибут "customer" для вызова на стороне сервера.
Например, на Python это будет выглядеть так:
stripe.Charge.create(
amount=1000,
currency='usd',
source="card_xxxxx",
customer='cus_xxxx',
application_fee=600,
destination={'account': 'acct_xxxx'}
)
Проверьте, добавлен ли атрибут "customer" при создании запроса на сервере, так как это необходимо для корректной обработки платежа.
Ни один из ответов здесь не сработал для меня.
Я пытался использовать библиотеку PHP от Stripe для того, чтобы списать деньги с карты, которая уже была сохранена у меня, следующим образом...
$charge = \Stripe\Charge::create([
'amount' => 1000,
'currency' => 'gbp',
'card' => 'card_xxx',
'description' => 'Payment for Sam',
]);
Но получал ошибку "no such token".
Чтобы это заработало, мне также пришлось указать идентификатор клиента вот так...
$charge = \Stripe\Charge::create([
'amount' => 1000,
'currency' => 'gbp',
'customer' => 'cus_xxx',
'card' => 'card_xxx',
'description' => 'Payment for Sam',
]);
Таким образом, убедитесь, что вы предоставляете идентификатор клиента при создании платежа, если вы хотите использовать уже существующую карту.
Чтобы решить вашу проблему, следуйте этим шагам:
Сначала проверьте, совпадают ли API-ключи на фронтенде и бэкенде. Они должны быть идентичными, иначе возможны ошибки при взаимодействии с API.
Если вы используете тестовые API-ключи, убедитесь, что передаете source: 'tok_visa' вместо вашего токена карты, например, source: 'tok_kb3kb23k2bk32bk3b2'. Это важно для корректного прохождения тестов.
Следуя этим рекомендациям, вы сможете избежать распространенных ошибок при работе с API.
Как узнать версию установленного npm пакета?
Как в Node.js "подключить" функции из других файлов?
Как задать переменные окружения из файла package.json?
Как остановить Babel от трансформации 'this' в 'undefined' и добавления "use strict"
Как предотвратить сдвижение вьюхи в iOS при появлении клавиатуры с помощью CSS или JS