@helldess

Почему не выдается баланс в телеграм боте?

Пишу сейчас телеграм бота на библиотеке aiogram.Оплата через модуль PyQiwiP2P
Я сделал так, что при пополнении баланса через киви пользователю выводиться сообщение, что баланс пополнен, но при этом в бд он не закидывается, скорее всего проблема в коде бд, но я не уверен. Т.е при пополнении баланса в профиле он все равно остается 0.

Код бд:
def user_balance(self, chat_id):
        with self.conn:
            result = self.cursor.execute("SELECT balance FROM 'users' WHERE chat_id = ?", (chat_id,)).fetchmany(1)
            return int(result[0][0])

    def set_balance(self, chat_id, balance):
        with self.conn:
            return self.cursor.execute("UPDATE 'users' SET 'balance' = ? WHERE 'chat_id' = ?", (balance, chat_id,))

    def add_check(self, chat_id, balance, bill_id):
        with self.conn:
            self.cursor.execute("INSERT INTO 'check' ('chat_id', 'balance', 'bill_id') VALUES (?,?,?)", (chat_id, balance, bill_id,))

    def get_check(self, bill_id):
        with self.conn:
            result = self.cursor.execute("SELECT * FROM 'check' WHERE bill_id = ?", (bill_id,)).fetchmany(1)
            if bool(len(result)):
                return result[0]

Код хендлера:
@dp.message_handler()
async def balance_message(message: types.Message):
    if message.chat.type == "private":
        if is_number(message.text):
            message_balance = float(message.text)
            if message_balance >= 10:
                comment = str(message.from_user.id) + "_" + str(random.randint(1000, 9999))
                bill = p2p.bill(amount=message_balance, lifetime=15, comment=comment)
                BotDB.add_check(message.from_user.id, message_balance, bill.bill_id)
                await bot.send_message(message.from_user.id, f"<b>Для пополнения баланса перейдите по кнопке и оплатите счет.</b>\n\n После оплаты, нажмите на проверить оплату.", reply_markup=buy_menu(url=bill.pay_url, bill=bill.bill_id), parse_mode='html')
            else:
                await bot.send_message(message.from_user.id, "❌ <b>Неверная сумма пополнения.</b>\n▶️ Cумма не должна быть меньше 10₽.\n Введите сумму для пополнения средств.", parse_mode='html')
        else:
            await bot.send_message(message.from_user.id, "♦ Неизвестная команда.\n▶️ Введите /start")


@dp.callback_query_handler(text_contains="check_")
async def check(callback: types.CallbackQuery):
    bill = str(callback.data[6:])
    info = BotDB.get_check(bill)
    if info != False:
        if str(p2p.check(bill_id=bill).status) == "PAID":
            user_balance = BotDB.user_balance(callback.from_user.id)
            bal = float(info[1])
            BotDB.set_balance(callback.from_user.id, user_balance+bal)
            await bot.send_message(callback.from_user.id, "✅ <b>Ваш баланс пополнен!</b>", parse_mode='html')
        else:
            await callback.answer("❌ Счет не оплачен!", show_alert=True)
    else:
        await callback.answer(" Счет не найден!", show_alert=True)
  • Вопрос задан
  • 330 просмотров
Решения вопроса 1
@o5a
Уже много раз обсуждалось. НЕ добавляйте кавычки к названиям идентификаторов (таблиц, полей). Иначе это воспринимается как текстовая строка. Здесь например
UPDATE 'users' SET 'balance' = ? WHERE 'chat_id' = ?
Он будет пытаться обновить те записи, где СТРОКА 'chat_id' = какой-то там номер.
Соответственно равны они не могут быть, и ничего не обновится.
Не надо в запросах добавлять эти кавычки.
Измените запрос так (и другие тоже заодно):
self.cursor.execute("UPDATE users SET balance = ? WHERE chat_id = ?", (balance, chat_id,))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы