Как получить доступ к 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» (но никогда не делитесь реальными ключами в публичном доступе).
<a href="https://www.tinkoff.ru/kassa/dev/payments/#tag/Standartnyj-platyozh/paths/~1GetState/post" rel="nofollow">https://www.tinkoff.ru/kassa/dev/payments/#tag/Sta...</a> <br/> Видимо таки какие-то параметры не те указываешь. <br/> <br/> Вот, как на самом деле формируется токен: <br/> <a href="https://www.tinkoff.ru/kassa/dev/payments/#section/Podpis-zaprosa" rel="nofollow">https://www.tinkoff.ru/kassa/dev/payments/#section...</a> <br/> <blockquote>Перед выполнением запроса MAPI проверяет, можно ли доверять его инициатору. Для этого сервер проверяет подпись запроса. В MAPI используется механизм подписи с помощью токена. Мерчант должен добавлять токен с каждому запросу, где это требуется.</blockquote> <br/> Токен - это не просто конкатенация. Это конкатенация + хэширование <br/> <br/> <blockquote><br/>
Она направила на документацию и на этот сайт <a href="https://tokentcs.web.app/" rel="nofollow">https://tokentcs.web.app/</a></blockquote> <br/> Этот сайт как раз демонстрирует, как происходит генерация токена исходя из пароля и параметров запроса <br/> <br/> Вот прям пошаговый алгоритм: <br/> 1. Собрать массив передаваемых данных в виде пар Ключ-Значения. В массив нужно добавить только параметры корневого объекта. Вложенные объекты и массивы не участвуют в расчете токена. <br/> <br/> В нашем случае это TerminalKey и PaymentId <br/> <br/> 2. Добавить в массив пару {Password, Значение пароля}. Пароль можно найти в личном кабинете Мерчанта <br/> 3. Отсортировать массив по алфавиту по ключу <br/> У нас получается Password, PaymentId, TerminalKey <br/> 4. Конкатенировать только значения пар в одну строку <br/> У нас получается <code>passwordd + Ter_key + str(order_id)</code> <br/> <b>ВАЖНО!</b> payment_id нужно брать именно такой, какой тебе пришёл из API. Лишние или недостающие нули - всё сразу пойдёт по сам-знаешь-какому месту. <br/> PS: тут я как раз обратил внимание, что у тебя в коде порядок не тот. Ты перепутал местами ter_key и order_id <br/> <br/> 5. <b>Применить к строке хеш-функцию SHA-256</b> <br/> В питоне для этого можно использовать <a href="https://docs.python.org/3/library/hashlib.html" rel="nofollow">hashlib</a> <br/> Я хз каким образом без этого у <a href="https://qna.habr.com/user/belkinark" rel="nofollow">belkinark</a> заработало. Мб он что-то напутал. <br/> 6. Добавить получившийся результат в значение параметра Token в тело запроса и отправить запрос
Похожие вопросы