Как настроить оплату в Aiogram 3.4
from aiogram import Bot, Router
from aiogram.types import Message, LabeledPrice, PreCheckoutQuery, ContentType
router = Router()
bot = None # Глобальная переменная для хранения bot
payments = None # Глобальная переменная для хранения оплаты
def set_bot(b: Bot):
global bot
bot = b # Установите bot здесь
def payments_bot(p):
global payments
payments = p
PRICE = LabeledPrice(label="Подписка на 1 месяц", amount=500*100) # в копейках (руб)
async def sub_bay(user_id):
await bot.send_invoice(user_id,
title="Подписка на бота",
description="Активация подписки на бота на 1 месяц",
provider_token=payments,
currency="rub",
photo_url="https://www.aroged.com/wp-content/uploads/2022/06/Telegram-has-a-premium-subscription.jpg",
photo_width=416,
photo_height=234,
photo_size=416,
is_flexible=False,
prices=[PRICE],
start_parameter="one-month-subscription",
payload="test-invoice-payload")
# pre checkout (must be answered in 10 seconds)
@router.pre_checkout_query_handler(lambda query: True)
async def pre_checkout_query(pre_checkout_q: PreCheckoutQuery):
await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True)
# successful payment
@router.message(content_types=ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment(message: Message):
print("SUCCESSFUL PAYMENT:")
payment_info = message.successful_payment.to_python()
for k, v in payment_info.items():
print(f"{k} = {v}")
await bot.send_message(message.chat.id,
f"Платеж на сумму {message.successful_payment.total_amount // 100} {message.successful_payment.currency} прошел успешно!!!")
Error
Traceback (most recent call last):
File "/root/bot/bot.py", line 9, in <module>
from handlers import user_commands, msg_user
File "/root/bot/handlers/__init__.py", line 1, in <module>
from . import user_commands
File "/root/bot/handlers/user_commands.py", line 9, in <module>
from subscribe import hour_sub, sub
File "/root/bot/subscribe/sub.py", line 39, in <module>
@router.pre_checkout_query_handler(lambda query: True)
AttributeError: 'Router' object has no attribute 'pre_checkout_query_handler'
Ответы (2 шт):
Автор решения: Andrey comp
→ Ссылка
async def sub_bay(user_id):
await bot.send_invoice(user_id,
title="Подписка на бота",
description="Активация подписки на бота на 1 месяц",
provider_token=payments,
currency="rub",
photo_url="https://www.aroged.com/wp-content/uploads/2022/06/Telegram-has-a-premium-subscription.jpg",
photo_width=416,
photo_height=234,
photo_size=416,
is_flexible=False,
prices=[PRICE],
start_parameter="one-month-subscription",
payload="test-invoice-payload")
@router.pre_checkout_query()
async def pre_checkout_query(pre_checkout_query: PreCheckoutQuery, bot: Bot):
await bot.answer_pre_checkout_query(pre_checkout_query.id, ok=True)
@router.message(F.content_types == ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment(message: Message):
await message.answer('Оплата прошла успешно!')
Автор решения: Kodzima
→ Ссылка
@router.pre_checkout_query(lambda query: True)
async def pre_checkout_query(pre_checkout_q: types.PreCheckoutQuery) -> None:
await pre_checkout_q.answer(ok=True)
@router.message(F.content_type == ContentType.SUCCESSFUL_PAYMENT)
async def successful_payment(message: types.Message) -> None:
await message.answer("successful payment!")