Ошибка "Нет такого токена" при отправке платежного запроса на Stripe
Я настраиваю платежи, используя API-интерфейс Stripe, чтобы пользователь мог войти в свою учетную запись Stripe на iPad и принять платежи от кого-либо. Для этого я использую Stripe Connect для входа в систему и сохранения идентификатора своей учетной записи, затем я использую STPPaymentCardTextField
для получения данных кредитной карты, а затем с помощью SDI для Stripe iOS. Я представляю карту (с тестовая карта - 4242...) и возврат токена через createTokenWithCard
. Это успешно возвращает токен. На этом этапе мне нужно отправить этот токен вместе с идентификатором целевой адреса (предоставленным приложению после входа пользователя) и другой информацией (валютой, суммой и т.д.) На мой собственный сервер, чтобы отправить платеж на Stripe. Я подтвердил, что информация передается и перенаправляется на Stripe, но Stripe возвращает ошибку:
{ type: 'invalid_request_error',
app[web.1]: message: 'No such token: tok_13vxes2eZkKYli2C9bHY1YfX',
app[web.1]: param: 'source',
app[web.1]: statusCode: 400,
app[web.1]: requestId: 'req_7AIT8cEasnzEaq' },
app[web.1]: requestId: 'req_7AIT8cEasnzEaq',
app[web.1]: statusCode: 400 }
Если мы отправляем информацию о кредитной карте напрямую, избегая всего токена, платеж будет успешным. Что-то не так с этим токеном, и мы не уверены, почему он терпит неудачу. Что здесь может быть не так?
[[STPAPIClient sharedClient] createTokenWithCard:card completion:^(STPToken *token, NSError *error) {
//submit tokenId and other info to 'charge' endpoint below
}
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)
})
})
Ответы
Ответ 1
Принятый ответ не работает для меня. Я использую правильный ключ для клиента и сервера, но проблема все еще остается. Я также отправляю исходный код с iOS на сервер, основываясь на примере полосы RocketRides, он отправляет идентификатор источника кредитной карты, которая называется "card_xxx", и это не сработает. Вам нужно будет добавить атрибут "клиент" для вызова на стороне вашего сервера.
Например: (питон)
stripe.Charge.create(amount=1000, currency='usd', source="card_xxxxx", **customer**='cus_xxxx', application_fee=600,destination={'account': 'acct_xxxx'})
Ответ 2
Вы уверены, что используете те же ключи API на своем сервере и клиенте?
Ваш сервер должен использовать секретный ключ (live/test), и ваше приложение iOS должно использовать ваш (живой/тестовый) файл для публикации, как указано здесь, на Stripe Testing.
Ответ 3
Ни один из ответов здесь не работал для меня.
Я пытался использовать библиотеку Stripe PHP для зарядки карты, которая у меня уже была в файле, как это...
$charge = \Stripe\Charge::create([
'amount' => 1000,
'currency' => 'gbp',
'card' => 'card_xxx',
'description' => 'Payment for Sam',
]);
И я получаю нет такой ошибки токена выше.
Чтобы заставить его работать, мне также нужно было указать идентификатор клиента, например...
$charge = \Stripe\Charge::create([
'amount' => 1000,
'currency' => 'gbp',
'customer' => 'cus_xxx',
'card' => 'card_xxx',
'description' => 'Payment for Sam',
]);
Ответ 4
Я столкнулся с той же проблемой для моей тестовой среды и ошибкой, которую я делал, я добавлял токен, полученный Stripe, как этот единственный источник: 'tok_18nnwSJ6tVEvTdcVs3dNIhGs', но для тестовой среды мы должны использовать источник: 'tok_visa'.
Вот список источников тестов, предоставленных Stripe. https://stripe.com/docs/testing#cards
Это создало клиента для меня, дайте мне знать, если это помогло кому-то еще.