Подтвердить что ты не робот

Ошибка "Нет такого токена" при отправке платежного запроса на 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)
  })
})
4b9b3361

Ответ 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

Это создало клиента для меня, дайте мне знать, если это помогло кому-то еще.