Как в aiogram сделать параллельный цикл с отправлением сообщений?

Хочу разобраться как сделать параллельный цикл так чтобы он мог отправить сообщение, находился в машинном состоянии и реагировал на нажатие кнопки "Отмена" останавливая при этом цикл. Пробовал библиотеки threading, но что-то не пошло.

Пишу бота для себя чтобы разобраться получше с Aiogram

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import Dispatcher, FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from pyautogui import *
from pyqiwip2p import QiwiP2P
from pyqiwip2p.p2p_types import QiwiCustomer, QiwiDatetime
import Qiwi_Token
import random
import threading, time


p2p = QiwiP2P(auth_key=Qiwi_Token.P2P_Qiwi_Token) #Токен Киви кошелька


bot = Bot(token="#####", parse_mode=types.ParseMode.HTML)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)



class BuyState(StatesGroup):  #Машинное состояние
    Buy_CM = State()

async def funct(state=BuyState.Buy_CM): #функция проверки платежа
        global a
        a = 0
        while True: #Создание цикла
            #Проверка статуса оплаты
            if p2p.check(new_bill.bill_id).status == 'PAID': #Проверка, на то - дошла ли оплата до бота. В случае положительного ответа, он выполняет данный if.
                await message.answer("Вы оплатили")
                break #Завершение цикла
            elif p2p.check(new_bill.bill_id).status == "EXPIRED": #Делаем проверку
                await message.answer('Мужик, ты че не оплатил?')
                break #Завершение цикла
            if p2p.check(new_bill.bill_id).status == 'REJECTED': #Проверка, на то - дошла ли оплата до бота. В случае положительного ответа, он выполняет данный if.
                break #Завершение цикла
            time.sleep(5)
        time.sleep(0.1) #Спим некое время, чтобы бот не крашнулся.


@dp.message_handler(commands=["start"])
async def start_message(message: types.Message):
    await message.answer("Привет?, вы попали в магазин\n<b>Telegram Games</b>?\n"
        "Где вы можете купить игру GTA5 Online?\nнажав команду <b>/buy</b> ???")

@dp.message_handler(commands=["help"])
async def help_message(message: types.Message):
    await message.answer("Наберите команду <b>/buy</b>\nЧтобу купить товар?")

@dp.message_handler(commands=['buy'])
async def cmd_buy(message: types.Message):
    await BuyState.Buy_CM.set() #Запуск состояния оплаты
    global new_bill
    global file

    new_bill = p2p.bill(bill_id=random.choice(range(100,99999999)), amount=150, lifetime=10)
    print(new_bill.bill_id, new_bill.pay_url)#Создаем ссылку для оплаты через киви


    button1 = types.InlineKeyboardButton(text="К оплате   150,00 RUB", url=new_bill.pay_url)
    button2 = types.InlineKeyboardButton(text="Отменить", callback_data="Отменить")
    markup = types.InlineKeyboardMarkup(row_width=1) #Создаем кнопки оплаты и отмены
    markup.add(button1,button2)

    
    file = "GTA5 game.jpg"  #Загружаем картинку и текст к товару
    photo = types.InputFile(file)
    await bot.send_photo(message.chat.id,photo=photo,caption=""
        "<b>?Epic Games аккаунт с игрой GTA 5?</b>\n"
        "?ПРЕДОСТАВЛЯЕСТЯ смена данных аккаунта + Доступ к почте\n"
        "?Банов в онлайне нет\n"
        "?<u>100% Гарантией Безопасности</u> (Пожизненно)интересуйтесь на все вопросы отвечу.",
        reply_markup=markup)
    await funct()

@dp.callback_query_handler(text="Отменить", state=BuyState.Buy_CM)
async def photo_update(call: types.CallbackQuery, state: FSMContext): #При нажатии инлайн кнопки отмены срабатывает код
        
    photo_update = types.InputMedia(media=types.InputFile(file), caption=""
    "<b>?Epic Games аккаунт с игрой GTA 5?</b>\n"
    "?ПРЕДОСТАВЛЯЕСТЯ смена данных аккаунта + Доступ к почте\n"
    "?Банов в онлайне нет\n"
    "?<u>100% Гарантией Безопасности</u> (Пожизненно)интересуйтесь на все вопросы отвечу.")
            
    await call.message.edit_media(photo_update)
    await bot.send_message(call.from_user.id,'?Вы отменили заказ?')
    p2p.reject(bill_id=new_bill.bill_id)
    await state.finish()


if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)```

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