from aiogram.types import LabeledPrice, Message  

from botlogic.keyboards.payment_keyboard import payment_keyboard  


async def send_invoice_handler(message: Message):  
    prices = [LabeledPrice(label="XTR", amount=20)]  
    await message.answer_invoice(  
        title="Поддержка канала",  
        description="Поддержать канал на 20 звёзд!",  
        prices=prices,  
        provider_token="",  
        payload="channel_support",  
        currency="XTR",  
        reply_markup=payment_keyboard(),  
    )

Предпродажная проверка. Счёт выставлен, пользователь нажимает "Оплатить". Если у него не хватает звёзд, система предложит их приобрести. Если звёзд у него хватает, он произведёт оплату, и в этот момент Telegram пришлёт в бота запрос "точно ли всё хорошо?". На ответ у нас будет ровно 10 секунд. Если мы по каким-то причинам не хотим принимать оплаты у данного пользователя или логика бота настроена на отмену платежа, в таком случае необходимо дать ответ, сигнализирующий об отмене платежа, сопроводив его причиной отмены. В противном же случае, подтверждаем, что всё "Ок".

В этом же файле создадим асинхронную функцию pre_checkout_handler, принимающую аргумент pre_checkout_query — объект класса PreCheckoutQuery.

В теле функции у переменной pre_checkout_query вызываем метод .answer, передавая в него аргумент ok со значением True.

Код функции:

from aiogram.types import PreCheckoutQuery


async def pre_checkout_handler(pre_checkout_query: PreCheckoutQuery):  
    await pre_checkout_query.answer(ok=True)

Информирование о покупке. Бюрократия позади, осталось только поздравить пользователя с покупкой!

В этом же файле создадим асинхронную функцию success_payment_handler, принимающую аргумент message — объект класса Message.

В объекте класса Message хранится различная информация о текущем сообщении, а в поле successful_payment находится информация о платеже, такая, как идентификатор платежа, сумма, валюта, информация, полученная от пользователя. По-хорошему, это всё необходимо сохранить во избежание возможных вопросов по платежам в будущем.

В теле функции делаем обычный ответ, сообщая, что покупка прошла успешно.

Код функции:

async def success_payment_handler(message: Message):  
    await message.answer(text="🥳Спасибо за вашу поддержку!🤗")

Команда paysupport и немного про возврат средств. Telegram также предъявляет условия к возврату средств пользователям. Не за все товары и услуги подразумевается возврат средств, однако у пользователя всё равно должна быть возможность запросить возврат средств, либо быть проинформированным касательно этого.

Для информирования пользователя обязательно должна быть команда /paysupport. В ней можно указать условия возврата, контактные данные и др. Давайте сделаем эту команду.

Создадим асинхронную функцию pay_support_handler, принимающую message — объект класса Message. В теле функции пропишем ответ на сообщение с текстом, описывающим условия для возврата средств.

Код функции:

async def pay_support_handler(message: Message):  
    await message.answer(  
        text="Добровольные пожертвования не подразумевают возврат средств, "  
        "однако, если вы очень хотите вернуть средства - свяжитесь с нами."    )

Непосредственно возврат средств можно сделать доступным пользователю. Для этого необходимо создать обработчик команды возврата, в котором, обращаясь к методу .refund_star_payment у объекта Bot, передать в него user_id и telegram_payment_charge_id.