Как с message хендлера перейти в query?

Возник вопрос - как реализовать переход с message хендлера на квери? Концепт следующий - пользователь вводит ФИО, далее message хендлер это обрабатывает, и должен дать сигнал другому хендлеру, что пользователь правильно ввел свое фио, и функция в этом хендлере заносит человека в бд. Если неправильное ФИО - то код возвращается в начало

Код:

@dp.callback_query_handler(text="vipcount")
async def checkname(query: CallbackQuery):
    keyboard = InlineKeyboardMarkup(row_width=1).add(
        InlineKeyboardButton(text="Назад", callback_data="Купить билет")
    )
    await query.message.answer("Введите свое ФИО")
    await InputData.input_fio.set()

@dp.message_handler(state=InputData.input_fio)
async def process_name(message: types.Message, state: FSMContext):
    print("od")
    keyboard = InlineKeyboardMarkup(row_width=1).add(
        InlineKeyboardButton(text="Продолжить оплату", callback_data="vipfinally"),
        InlineKeyboardButton(text="Назад", callback_data="vipcount")

    )
    global teleid
    global xd
    teleid = message.from_user.id
    xd = message.text
    if xd == "/start":
        return
    print("od")

    await bot.send_message(
        message.chat.id,

        md.text(
            md.text("Проверьте данные"),
            md.text("Ваше имя -", md.bold(xd))
        ),
        parse_mode = ParseMode.MARKDOWN, reply_markup=keyboard
    )
    await InputData.next()

@dp.callback_query_handler(text="Продолжить оплату")
async def vipfin(query: CallbackQuery):
    print("okkkk")
    conn = await aiomysql.connect(host='localhost', port=3306, user='root', password='',
                                  db='aiodb',
                                  loop=loop)
    cur = await conn.cursor()
    sql = "SELECT name FROM users WHERE teleid=(%s)"
    await cur.execute(sql, (teleid))
    row = await cur.fetchone()
    name = xd
    print(row)
    row = row[0]
    print("olk")
    teled = teleid
    start_sql = "UPDATE users set name = (%s) where teleid=(%s)"
    conn = await aiomysql.connect(host='localhost', port=3306, user='root', password='',
                                  db='aiodb',
                                  loop=loop)
    cur = await conn.cursor()
    await cur.execute(start_sql, (name, teled))
    await conn.commit()

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

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

Собственно вам кажись не нужно возвращаться в колбек (кстати это невозможно).
Просто оставьте юзера в том же стейте в котором он вводил фио и в зависимости от введенных данных либо пишите что всё ок и закрываете стейт, либо не трогаете стейт и сообщаете юзеру что он неверно ввел фио.

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State

from data import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class InputFio(StatesGroup):
    FIO = State()


@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    await message.answer("Введите ФИО")
    await InputFio.FIO.set()


@dp.message_handler(state=InputFio.FIO)
async def get_FIO(message: types.Message, state: FSMContext):
    if message.text == "lalala":
        await state.finish()
        # заносим в бд
        ...
    else:
        await message.answer("неверно! Введите ФИО правильно!")


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
→ Ссылка