Как получить доступ к API Tinkoff и создать токен для его использования?

Как правильно соединить пароль, id и терминал, чтобы создать токен для проверки статуса платежа? 

Код, который у меня есть, не работает, и я получаю сообщение об ошибке "Неверный токен. Проверьте пару TerminalKey/SecretKey." Как мне исправить эту проблему, чтобы можно было проверить статус платежа? 

Вот часть кода, которую я использую для проверки статуса платежа: 

```python
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
```
  • 25 января 2024 г. 17:28
Ответы на вопрос 2
Для того чтобы начать работу с API Tinkoff, вам необходимо зарегистрироваться в качестве партнера и получить доступ к платежному шлюзу Tinkoff. После регистрации вам будут предоставлены данные, такие как `TerminalKey` (идентификатор терминала) и `SecretKey` (секретный ключ), которые понадобятся для создания токена и авторизации запросов к API.

Обычно токен формируется на основе различных параметров, включая `TerminalKey`, параметры платежа (например, сумму и идентификатор заказа) и `SecretKey`. Токен генерируется как SHA256-хэш от конкатенации передаваемых параметров в определенном порядке, после чего к последовательности присоединяется `SecretKey`.

Примерный алгоритм создания токена может выглядеть так:
```python
import hashlib
import hmac

def generate_token(data, secret_key):
    # Отсортировать ключи в порядке возрастания и создать строку параметров
    sorted_keys = sorted(data.keys())
    values = [str(data[key]) for key in sorted_keys if data[key] is not None]
    values_string = ''.join(values)
    
    # Присоединить SecretKey к строке параметров
    token_string = values_string + secret_key
    
    # Посчитать HMAC-SHA256 от строки параметров
    token_hash = hmac.new(secret_key.encode(), token_string.encode(), hashlib.sha256).hexdigest()
    
    return token_hash

# Словарь с параметрами платежа для примера
data = {
    'TerminalKey': 'YourTerminalKey',
    'PaymentId': order_id,
    # Добавьте другие необходимые параметры сюда...
}

# Ваш секретный ключ
secret_key = 'YourSecretKey'

# Генерация токена
token = generate_token(data, secret_key)
print(token)
```

Теперь о вашем коде: убедитесь, что все значения, используемые для создания токена, корректные. Как правило, сообщение об ошибке "Неверный токен. Проверьте пару TerminalKey/SecretKey." означает, что генерация токена была сделана неправильно или что в запросе использовались некорректные `TerminalKey` или `SecretKey`.

Кроме того, вы должны использовать AsyncIO и aiohttp краткосрочно, в случае с созданием токена это не потребуется:

```python
# ... Продолжение вашего кода ...

# Возможно вам потребуется дополнить словарь data другими параметрами,
# которые требуются для генерации токена в соответствии с документацией Tinkoff API.
tok = generate_token(data, secret_key)
```

Не забудьте заменить `YourTerminalKey` и `YourSecretKey` на реальные значения, которые вы получили от Tinkoff.

Если вам требуется помощь с конкретной ошибкой, подробнее распишите, какие шаги вы предприняли, и предоставьте детали ваших пар «TerminalKey/SecretKey» (но никогда не делитесь реальными ключами в публичном доступе).
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. Конкатенировать только значения пар в одну строку
У нас получается passwordd + Ter_key + str(order_id)
ВАЖНО! payment_id нужно брать именно такой, какой тебе пришёл из API. Лишние или недостающие нули - всё сразу пойдёт по сам-знаешь-какому месту.
PS: тут я как раз обратил внимание, что у тебя в коде порядок не тот. Ты перепутал местами ter_key и order_id

5. Применить к строке хеш-функцию SHA-256
В питоне для этого можно использовать hashlib
Я хз каким образом без этого у belkinark заработало. Мб он что-то напутал.
6. Добавить получившийся результат в значение параметра Token в тело запроса и отправить запрос
Похожие вопросы