Не обрабатывается хендлер успешной оплаты в aiogram боте
Версия aiogram 3.10. Пишу тг бота для онлайн магазина. Оплата должна проходить через сбербанк. Код для оплаты:
import asyncio
import logging
from aiogram import Bot, Dispatcher, F
from aiogram.types import Message, CallbackQuery, LabeledPrice, PreCheckoutQuery
import config
from app.database.models import async_main
from app.handlers.user import user_router
from app.handlers.admin import admin_router
import app.database.requests as rq
bot = Bot(token=config.TOKEN)
dp = Dispatcher()
async def main():
await async_main() #подключение бд
dp.include_routers(admin_router, user_router)
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())
@user_router.callback_query(F.data == 'to_pay')
async def buy(callback: CallbackQuery):
items = await rq.get_basket(callback.from_user.id) #достает все товары из корзины пользователя
if config.PAYMENTS_TOKEN.split(':')[1] == 'TEST':
await bot.send_message(callback.message.chat.id, 'Тестовый платеж')
for item in items:
price = LabeledPrice(label=item.name, amount=item.price * 100)
await bot.send_invoice(callback.message.chat.id,
title=item.name,
description='Покупка товаров',
provider_token=config.PAYMENTS_TOKEN,
currency='rub',
is_flexible=False,
prices=[price],
payload='text-invoice-payload')
@user_router.pre_checkout_query(lambda query: True)
async def pre_checkout_query(pre_checkout_q: PreCheckoutQuery):
await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True)
@user_router.message(F.successful_payment)
async def successful_payment(message: Message):
payment_info = message.successful_payment.to_python()
for k, v in payment_info.items():
print(f'{k} = {v}')
await bot.send_message(message.chat.id, 'Платеж прошел успешно')
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
try:
asyncio.run(main())
except KeyboardInterrupt:
print('Бот выключен')
Первые два хендлера отрабатывают без ошибок:
INFO:aiogram.event:Update id=58643160 is handled. Duration 375 ms by bot id=7496369870 INFO:aiogram.event:Update id=58643160 is handled. Duration 469 ms by bot id=7496369870
После ввода пользователем реквизитов карты и подтверждения оплаты должен начать отрабатываться третий хендлер, но в телеграме у пользователя идет ожидание, после некоторого времени появляется BOT_PRECHECKOUT_TIMEOUT. В терминале ошибок нет. Я знаю, что тестовая оплата не должна превышать 1000 рублей (цена за товар который пытаюсь купить меньше). Пытался шаманить с F фильтром, пытался запустить хендлер через state состояние, но хендлер не обрабатывается. По всей видимости проблема не в САМОМ хендлере и то как его пытаться вызывать, а в чем-то другом. Пытался подключить юкассу к этому же коду. Вместо BOT_PRECHECKOUT_TIMEOUT пишет: 'Не удалось провести транзакцию. Описание ошибки со стороны платежной системы: не получилось: похоже в данных ошибка. Попробуйте еще'.
Ответы (1 шт):
@router.pre_checkout_query() не требует обязательных аргументов, ошибка возникает из за того что сервер телеграм не получил ok=True от бота.
Декоратор перед pre_checkout_query должен выглядеть в идеале так:
@user_router.pre_checkout_query()
А не видит ok=True телеграмм из за того что ответ вы отправляете неправильно. Вместо:
await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True)
Должно быть:
await pre_checkout_q.answer(ok=True)