Загрузка...

Ошибка при проверке оплаты

Тема в разделе Python создана пользователем скамер2024 3 янв 2025. 209 просмотров

  1. скамер2024
    скамер2024 Автор темы 3 янв 2025 0 5 окт 2024
    Python
    import logging
    from aiogram import Bot, Dispatcher, Router, F
    from aiogram.types import BotCommand, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
    from aiogram.filters import Command
    import aiohttp
    import asyncio

    # Настройки
    TELEGRAM_TOKEN = ''
    CRYPTOPAY_API_TOKEN = ''

    # Логирование
    logging.basicConfig(level=logging.INFO)

    # Создаем бота и диспетчер
    bot = Bot(token=TELEGRAM_TOKEN)
    dp = Dispatcher()
    router = Router() # Создаем маршрутизатор

    # Словарь для хранения данных счетов
    invoices = {}

    # Установка команд
    async def set_commands(bot: Bot):
    commands = [
    BotCommand(command="start", description="Начать работу"),
    BotCommand(command="invoice", description="Создать счет"),
    ]
    await bot.set_my_commands(commands)

    # Обработчик команды /start
    @router.message(Command("start"))
    async def send_welcome(message):
    await message.answer("Привет! Я бот для работы с Crypto Pay. Используйте команду /invoice для создания счета.")

    # Обработчик команды /invoice
    @router.message(Command("invoice"))
    async def create_invoice(message):
    amount = 1.0 # Сумма
    currency = 'USDT' # Валюта
    description = 'Оплата за услуги'

    invoice = await create_crypto_invoice(amount, currency, description)
    if invoice:
    pay_url = invoice.get('pay_url')
    invoice_id = invoice.get('invoice_id')
    invoices[invoice_id] = invoice # Сохраняем данные счета

    # Создаем кнопку для проверки оплаты
    keyboard = InlineKeyboardMarkup(
    inline_keyboard=[
    [InlineKeyboardButton(text="Проверить оплату", callback_data=f"check_payment:{invoice_id}")]
    ]
    )
    await message.answer(f"Счет создан! Оплатите по ссылке: {pay_url}", reply_markup=keyboard)
    else:
    await message.answer("Не удалось создать счет. Попробуйте позже.")

    # Функция для создания счета через Crypto Pay API
    async def create_crypto_invoice(amount, currency, description):
    url = 'https://testnet-pay.crypt.bot/api/createInvoice'
    headers = {
    'Crypto-Pay-API-Token': CRYPTOPAY_API_TOKEN,
    'Content-Type': 'application/json'
    }
    payload = {
    'asset': currency,
    'amount': amount,
    'description': description
    }
    async with aiohttp.ClientSession() as session:
    async with session.post(url, json=payload, headers=headers) as response:
    response_text = await response.text()
    logging.info(f"Запрос: {payload}")
    logging.info(f"Ответ: {response_text}")
    if response.status == 200:
    result = await response.json()
    if result.get('ok'):
    return result.get('result')
    logging.error(f"Ошибка при создании счета: {response.status}")
    return None

    # Обработчик кнопки "Проверить оплату"
    @router.callback_query(F.data.startswith('check_payment'))
    async def check_payment_status(callback: CallbackQuery):
    invoice_id = callback.data.split(":")[1]
    invoice = invoices.get(invoice_id)
    if invoice:
    status = await get_payment_status(invoice_id)
    if status:
    await callback.message.answer(f"Статус оплаты: {status}")
    else:
    await callback.message.answer("Не удалось получить статус оплаты.")
    else:
    await callback.message.answer("Счет не найден.")

    # Функция для проверки статуса счета через Crypto Pay API
    async def get_payment_status(invoice_id):
    url = 'https://pay.crypt.bot/api/getInvoices'
    headers = {
    'Crypto-Pay-API-Token': CRYPTOPAY_API_TOKEN
    }
    payload = {
    'invoice_ids': [invoice_id]
    }
    async with aiohttp.ClientSession() as session:
    async with session.post(url, json=payload, headers=headers) as response:
    response_text = await response.text()
    logging.info(f"Запрос: {payload}")
    logging.info(f"Ответ: {response_text}")
    if response.status == 200:
    result = await response.json()
    if result.get('ok'):
    invoices = result.get('result', [])
    if invoices:
    return invoices[0].get('status') # Возвращаем статус счета
    logging.error(f"Ошибка при получении статуса счета: {response.status}")
    return None

    # Запуск бота
    async def main():
    await set_commands(bot)
    dp.include_router(router) # Подключаем маршрутизатор
    await dp.start_polling(bot)

    if __name__ == '__main__':
    asyncio.run(main())
    После оплаты при нажатии проверки оплаты пишет, что счет не найден. Как фикс?
     
    1. скамер2024 Автор темы
  2. Aisan
    Aisan 3 янв 2025 Ничего не продаю и не создаю. Не пишите мне 15 857 26 авг 2020
    У тебя create_crypto_invoice () возвращает None, который ты записываешь в словарик
    Естественно потом когда ты достаешь этот None тебе пишется сто инвойса нет
     
    1. скамер2024 Автор темы
      Aisan, и что делать
  3. NingaGo
    NingaGo 3 янв 2025 44 9 фев 2024
    1. Посмотреть предыдущие комментарии (1)
    2. stavn
      скамер2024, зачем изобретать заново велосипед, когда уже всё придумано за тебя? Просто бери и используй. Aiocryptopay - самая удобная на данный момент библиотека для взаимодействия с CryptoPay API, документация написана на нормальном языке, так ещё и примеры предоставлены. И причем тут версия aiogram?
    3. NingaGo
      скамер2024, версия аиограма не играет важную роль при использовании библиотеки Aiocryptopay. И да, зачем ты упомянул версию ?
Top
Загрузка...