Подключение эквайринга Тинькофф банка к 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 шт):
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()
Смотрим документацию.
- Отсортировать массив по алфавиту по ключу.
[{"Amount": "19200"},{"Description": "Подарочная карта на 1000 рублей"},{"OrderId": "21090"},{"Password": "usaf8fw8fsw21g"},{"TerminalKey": "MerchantTerminalKey"}]
- Конкатенировать только значения пар в одну строку.
"19200Подарочная карта на 1000 рублей21090usaf8fw8fsw21gMerchantTerminalKey"
- Применить к строке хеш-функцию 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
у вас называется.