Как проверять статус платежа telebot Python?
Я новичок, как ни странно в этом деле. Пишу своего телеграмм бота используя документацию pyTelegramBotAPI. Возник вопрос с платежами. У меня подключена yookassa, работаю как самозанятый. Через BotFather реализация не работает для самозанятого думаю вы в курсе. Пошел другим путем через API yookassa. В этом я тоже полный ноль , действовал по инструкции в официальной документации. Кое-что получилось,у меня есть кнопка "купить подписку". Собственно это мне и нужно реализовать. Высылаю форму с оплатой, пользователь делает покупку и возвращается на сайт, все вроде хорошо. Но как мне после этого в автоматическом режиме активировать эту подписку и дать преимущества пользователю? Как проверять статус платежа одновременно с работой самого бота? Я перепробовал почти все, думаю как-то через потоки нужно, но ничего не выходит. Я только куски кода вставил, и это последний вариант, на котором я остановился, но пробовал очень много всего.
def pay(): #Выставить счет на оплату
idempotence_key = str(uuid.uuid4())
payment = Payment.create({
"amount": {
"value": "2.00",
"currency": "RUB"
},
"payment_method_data": {
"type": "bank_card"
},
"confirmation": {
"type": "redirect",
"return_url": "https://t.me/MYBot"
},
"capture": True,
"description": "Заказ №1"
}, idempotence_key)
return payment
def pay_st(payid,userid,chatid): #Цикл проверяющий статус платежа
count = 300
while True:
time.sleep(1)
print(*(Payment.find_one(payid).status))
if Payment.find_one(payid).status == 'succeeded':
upd_bd('sub',1,userid)
bot.send_message(chatid, "?Подписка активированна!?", reply_markup=markup2)
break
elif count == 0:
break
count-=1
def thread(use,chat): #Вот поток, но он ломается, когда хотя бы 2 пользователя совершают оплату
th1 = threading.Thread(target = pay_st(sel_bd('pay_id',use),use,chat)).start()
return th1
@bot.message_handler(state="*", func=lambda message: message.text == '?Купить подписку?')
async def handle_text(message):
#Оплата
if message.text == '?Купить подписку?':
if sel_bd('sub',message.from_user.id) == 1:
await bot.send_message(message.chat.id, 'Вы уже приобрели подписку?',
reply_markup=markup2)
elif sel_bd('sub',message.from_user.id) == 0:
await bot.send_message(message.chat.id,
"бла бла бла", reply_markup=markup2)
# get confirmation url
confirmation_url = pay().confirmation.confirmation_url
upd_bd('pay_id',confirmation_url.split('=')[1],message.from_user.id)
keyboard = types.InlineKeyboardMarkup()
url_button = types.InlineKeyboardButton(text="Оплатить 108руб", url=confirmation_url)
callback_button11 = types.InlineKeyboardButton(text="Отмена", callback_data="cb_data_1")
callback_button12 = types.InlineKeyboardButton(text="Связь с разработчиком", callback_data="cb_data_2")
keyboard.row(url_button,callback_button11)
keyboard.add(callback_button12)
pay_con(confirmation_url)
await bot.send_message(message.chat.id, "Привет! Нажми на кнопку Оплатить, что бы
активировать подписку.", reply_markup=keyboard)
thread(message.from_user.id,message.chat.id)
Этот код кажется работает, но никак не могу прислать ответ, что подписка активирована.
class MyThread(threading.Thread):
def __init__(self, payid, userid, chatid):
threading.Thread.__init__(self)
self.payid = payid
self.userid = userid
self.chatid = chatid
def run(self):
count = 5
while True:
time.sleep(1)
print(*(Payment.find_one(self.payid).status))
if Payment.find_one(self.payid).status == 'succeeded':
upd_bd('sub',1,self.userid)
bot.send_message(self.chatid, "?Подписка активированна!?",reply_markup=markup2)
break
elif count == 0:
break
count-=1
Запуск самого потока:
MyThread(sel_bd('pay_id',message.from_user.id),message.from_user.id,message.chat.id).start()
А вот ошибка: Warning (from warnings module): File "C:\Users\PC\Desktop\Bot\mybot.py", line 68 bot.send_message(self.chatid, "?Подписка активированна!?", reply_markup=markup2) RuntimeWarning: coroutine 'AsyncTeleBot.send_message' was never awaited