@Danilka2400

Как создать Токен для Tinkoff?

Доброго времени суток, столкнулся с такой проблемой.
{'Success': False, 'ErrorCode': '204', 'Message': 'Неверные параметры.', 'Details': 'Неверный токен. Проверьте пару TerminalKey/SecretKey.'}

на форуме было ответ, в виде соединить пароль+id+терминал и вот токен, но не получилось.

Из-за этого не могу сделать проверку статуса платежа

async def check_payment_status(order_id: int):
    id=f"{order_id}_"
    tok=passwordd+str(order_id)+Ter_key
    

    async with aiohttp.ClientSession() as session:
        async with session.post(
             TINKOFF_API_URL_get,
             json={
                 "TerminalKey": Ter_key,
                "Token" : tok,
                 "PaymentId": order_id,
                 
             }
         ) as response:
             data = await response.json()
             print(data)
             
             if data["Success"]:
                 return data["Status"]
             else:
                 return None
  • Вопрос задан
  • 389 просмотров
Решения вопроса 2
vabka
@vabka
Токсичный шарпист
https://www.tinkoff.ru/kassa/dev/payments/#tag/Sta...
Видимо таки какие-то параметры не те указываешь.

Вот, как на самом деле формируется токен:
https://www.tinkoff.ru/kassa/dev/payments/#section...
Перед выполнением запроса MAPI проверяет, можно ли доверять его инициатору. Для этого сервер проверяет подпись запроса. В MAPI используется механизм подписи с помощью токена. Мерчант должен добавлять токен с каждому запросу, где это требуется.

Токен - это не просто конкатенация. Это конкатенация + хэширование


Она направила на документацию и на этот сайт https://tokentcs.web.app/

Этот сайт как раз демонстрирует, как происходит генерация токена исходя из пароля и параметров запроса

Вот прям пошаговый алгоритм:
1. Собрать массив передаваемых данных в виде пар Ключ-Значения. В массив нужно добавить только параметры корневого объекта. Вложенные объекты и массивы не участвуют в расчете токена.

В нашем случае это TerminalKey и PaymentId

2. Добавить в массив пару {Password, Значение пароля}. Пароль можно найти в личном кабинете Мерчанта
3. Отсортировать массив по алфавиту по ключу
У нас получается Password, PaymentId, TerminalKey
4. Конкатенировать только значения пар в одну строку
У нас получается Password + PaymentID + TerminalKey
ВАЖНО! payment_id нужно брать именно такой, какой тебе пришёл из API. Лишние или недостающие нули - всё сразу пойдёт по сам-знаешь-какому месту.

5. Применить к строке хеш-функцию SHA-256
В питоне для этого можно использовать hashlib
Я хз каким образом без этого у belkinark заработало. Мб он что-то напутал.
6. Добавить получившийся результат в значение параметра Token в тело запроса и отправить запрос
Ответ написан
@Danilka2400 Автор вопроса
Я нашёл статью https://itdid.ru/acquiring.html

Там Было описано метод не GetState, а CheckOrder , и Токен так OrderId+Password+Terminalkey и всё заработала, он выдал результат, где в

'Payments': [{'Success': True, 'Amount': 100, 'Status': 'CONFIRMED', 'PaymentId': '****', 'RRN': '****'}, {'Success': True, 'Amount': 100, 'Status': 'FORM_SHOWED', 'PaymentId': '******'}]

и получается staus CONFIRMED означает что оплата была произведена, да?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы