Created
December 19, 2023 12:44
-
-
Save TannicArcher/0ec4050509d98d293bfbab6e4f6cbdb6 to your computer and use it in GitHub Desktop.
Check payment(QIWI)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from aiogram import Bot, types | |
from aiogram.dispatcher import Dispatcher | |
from aiogram.utils import executor | |
from aiogram.types import ReplyKeyboardRemove, ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton | |
import requests | |
import random | |
import logging | |
# Импорт конфигурации из файла config.py | |
import config | |
import keyboard | |
# Настройка логгирования | |
logging.basicConfig(level=logging.INFO) | |
# Инициализация бота и диспетчера | |
bot = Bot(token=config.telegram_token) | |
dp = Dispatcher(bot) | |
# Функция для получения истории платежей из Qiwi | |
async def get_history(phone, token): | |
try: | |
s = requests.Session() | |
s.headers['authorization'] = 'Bearer ' + token | |
parameters = {'rows': 4, 'operation': 'IN'} | |
h = s.get(f'https://edge.qiwi.com/payment-history/v2/persons/{phone}/payments', params=parameters) | |
return h.json() | |
except requests.exceptions.RequestException as e: | |
logging.error("Произошла ошибка при запросе к серверу Qiwi", exc_info=True) | |
return None | |
# Обработчик команды /start | |
@dp.message_handler(commands=['start']) | |
async def start_handler(message: types.Message): | |
await bot.send_message(message.from_user.id, 'Добро пожаловать!\nЧтобы приобрести доступ, воспользуйтесь клавиатурой.', reply_markup=keyboard.buy_lic) | |
# Обработчик сообщения "🔒 Приобрести доступ 🔒" | |
@dp.message_handler(text='🔒 Приобрести доступ 🔒') | |
async def purchase_handler(message: types.Message): | |
random_code = random.randint(1, 1000000) | |
# Формирование ссылки для оплаты в зависимости от конфигурации pay_to_nick | |
account_identifier = config.nick if config.get('pay_to_nick', False) else config.number | |
link = f"https://qiwi.com/payment/form/99999?extra%5B%27account%27%5D={account_identifier}&amountInteger={config.cost}&amountFraction=0&extra%5B%27comment%27%5D={random_code}¤cy=643&blocked%5B0%5D=sum&blocked%5B1%5D=comment&blocked%5B2%5D=account" | |
# Создание встроенной клавиатуры для опций оплаты | |
payment_keyboard = InlineKeyboardMarkup() | |
payment_keyboard.add(InlineKeyboardButton('Проверить оплату', callback_data=f'check_payment_{random_code}'), InlineKeyboardButton('Перейти к оплате', url=link)) | |
# Отправка сообщения с деталями оплаты и встроенной клавиатурой | |
await message.reply(f'💵 Оплатите доступ 💵\n\n📱 Идентификатор: {account_identifier}\n🔐 Комментарий: {random_code} (ОБЯЗАТЕЛЬНО УКАЖИТЕ)\n💰 Цена: {config.cost}р\n\n🚀 Для удобства перейдите по ссылке', reply=False, reply_markup=payment_keyboard) | |
# Обработчик коллбэк-запроса для проверки оплаты | |
@dp.callback_query_handler(text_contains='check_payment_') | |
async def check_payment_handler(call: types.CallbackQuery): | |
code = call.data.split('_')[-1 | |
try: | |
# Получение истории платежей Qiwi | |
qiwi_history = await get_history(config.number, config.qiwi) | |
# Проверка, найден ли платеж с указанным кодом и суммой | |
for i in range(4): | |
if qiwi_history and qiwi_history.get('data', {}).get(i, {}).get('comment') == str(code) and qiwi_history['data'][i]['sum']['amount'] == int(config.cost): | |
await call.message.edit_text(f'🔐 Оплата найдена 🔐') | |
return | |
# Если платеж не найден, предоставление опции проверить снова | |
payment_keyboard = InlineKeyboardMarkup() | |
payment_keyboard.add(InlineKeyboardButton('Проверить оплату', callback_data=f'check_payment_{code}')) | |
await bot.send_message(call.from_user.id, 'Платеж не найден.', reply_markup=payment_keyboard) | |
except Exception as e: | |
# Обработка исключений и уведомление пользователя | |
logging.error("Произошла ошибка при проверке оплаты", exc_info=True) | |
payment_keyboard = InlineKeyboardMarkup() | |
payment_keyboard.add(InlineKeyboardButton('Проверить оплату', callback_data=f'check_payment_{code}')) | |
await bot.send_message(call.from_user.id, "Администратор не настроил оплату, уведомите его об этом") | |
# Запуск опроса | |
if __name__ == '__main__': | |
executor.start_polling(dp) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment