Подключение эквайринга Тинькофф банка к telegrambot на python

Не могу понять. Пишу код: мне в логах пишет: Ответ от Tinkoff: {'Success': False, 'ErrorCode': '204', 'Message': 'Неверные параметры.', 'Details': 'Неверный токен. Проверьте пару TerminalKey/SecretKey.'}. Что значит SecretKey? Я приложил терминал и пароль от него но Тинька ругается. Подскажите

async def create_tinkoff_payment(amount: int, order_id: str, description: str, success_url: str) -> str:
"""
Создание платежа через Tinkoff API.
"""
async with httpx.AsyncClient() as client:
    payload = {
        "TerminalKey": TINKOFF_TERMINAL_KEY,
        "Amount": amount * 100,  # Tinkoff ожидает сумму в копейках
        "OrderId": order_id,
        "Description": description,
        "SuccessURL": success_url,
    }
    payload["Token"] = generate_tinkoff_token(payload)

    # Логирование отправляемого запроса
    print("Отправляемый запрос:", payload)

    response = await client.post(TINKOFF_API_URL, json=payload)
    response_data = response.json()

    # Логирование ответа от Tinkoff
    print("Ответ от Tinkoff:", response_data)

    if response_data.get("Success"):
        return response_data["PaymentURL"]
    else:
        raise Exception(f"Ошибка при создании платежа: {response_data.get('Message')}")


def generate_tinkoff_token(payload: dict) -> str:
    """
    Генерация токена для Tinkoff API.
    """
    token_str = (
        f"{TINKOFF_SECRET_KEY}{payload['Amount']}{payload['OrderId']}"
        f"{payload['Description']}{payload['TerminalKey']}"
    )
    return hashlib.sha256(token_str.encode("utf-8")).hexdigest()


@router.message(Command("start"))
async def start_handler(message: types.Message):
    try:
        order_id = f"{message.from_user.id}_{message.message_id}"
        payment_url = await create_tinkoff_payment(
            amount=100,  # Сумма в рублях
            order_id=order_id,
            description="Оплата тестового товара",
            success_url="https://securepay.tinkoff.ru/html/payForm/success.html",  # Ссылка на успешную оплату
    )

    keyboard = InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="Оплатить", url=payment_url)]
        ]
    )
    await message.answer("Оплатите, пожалуйста:", reply_markup=keyboard)
except Exception as e:
    await message.answer(f"Ошибка: {str(e)}")

Ответы (1 шт):

Автор решения: CrazyElf
def generate_tinkoff_token(payload: dict) -> str:
    """
    Генерация токена для Tinkoff API.
    """
    token_str = (
        f"{TINKOFF_SECRET_KEY}{payload['Amount']}{payload['OrderId']}"
        f"{payload['Description']}{payload['TerminalKey']}"
    )
    return hashlib.sha256(token_str.encode("utf-8")).hexdigest()

Смотрим документацию.

  1. Отсортировать массив по алфавиту по ключу.

[{"Amount": "19200"},{"Description": "Подарочная карта на 1000 рублей"},{"OrderId": "21090"},{"Password": "usaf8fw8fsw21g"},{"TerminalKey": "MerchantTerminalKey"}]

  1. Конкатенировать только значения пар в одну строку.

"19200Подарочная карта на 1000 рублей21090usaf8fw8fsw21gMerchantTerminalKey"

  1. Применить к строке хеш-функцию SHA-256 (с поддержкой UTF-8).

"0024a00af7c350a3a67ca168ce06502aa72772456662e38696d48b56ee9c97d9"

У вас неправильный порядок полей для генерации токена. Правильно будет видимо так:

def generate_tinkoff_token(payload: dict) -> str:
    """
    Генерация токена для Tinkoff API.
    """
    token_str = (
        f"{payload['Amount']}{payload['Description']}{payload['OrderId']}"
        f"{TINKOFF_SECRET_KEY}{payload['TerminalKey']}"
    )
    return hashlib.sha256(token_str.encode("utf-8")).hexdigest()

Ну а SecretKey - это видимо TINKOFF_SECRET_KEY у вас называется.

→ Ссылка