Два часа потерял из-за того, что не написал один хендлер
Делал платежи в Telegram-боте. Нативные, через sendInvoice и ЮKassa.
Всё настроил: токен от BotFather получил, инвойс отправляется, кнопка оплаты появляется. Пользователь нажимает - и платёж падает с ошибкой. Молча. Без подробностей.
Payment failed
И всё. Telegram не говорит что именно не так.
Полез гуглить. Первая мысль - provider_token неверный. Проверил три раза, скопировал заново. Нет, токен правильный.
Потом решил что проблема в суммах - они передаются в копейках, не в рублях. 500 рублей = 50000. Перепроверил, у меня было правильно.
Потом подумал на webhook - может HTTPS не настроен как надо. Потратил минут сорок на проверку сертификата, перенастройку ngrok. Всё работает, но платежи всё равно падают.
Уже хотел идти спать, случайно наткнулся на строчку в документации:
Your bot must reply to this query in 10 seconds
Это про pre_checkout_query. Когда пользователь нажимает «Оплатить» - Telegram сначала отправляет боту запрос на подтверждение. Бот должен ответить в течение 10 секунд. Если не ответил - платёж автоматически отклоняется.
У меня хендлера для этого не было вообще. Бот просто молчал.
Добавил три строки:
python
@dp.pre_checkout_query() async def pre_checkout(query: types.PreCheckoutQuery): await query.answer(ok=True)
Платёж прошёл с первого раза.
Два часа отладки из-за трёх строк кода которые я не написал.
Если кто-то тоже делает платежи в Telegram-боте и получает молчаливый отказ - проверьте pre_checkout_query первым делом, до всего остального.









