Загрузка...

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

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

  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. скамер2024 Автор темы
      NingaGo, залупа если честно, на аиограм 2.41 еще ладно, но на 3.х уже залупа
    2. stavn
      скамер2024, зачем изобретать заново велосипед, когда уже всё придумано за тебя? Просто бери и используй. Aiocryptopay - самая удобная на данный момент библиотека для взаимодействия с CryptoPay API, документация написана на нормальном языке, так ещё и примеры предоставлены. И причем тут версия aiogram?
    3. NingaGo
      скамер2024, версия аиограма не играет важную роль при использовании библиотеки Aiocryptopay. И да, зачем ты упомянул версию ?
Top
Загрузка...