Не обрабатывается хендлер успешной оплаты в 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 шт):

Автор решения: Samikague

@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)
→ Ссылка