GenEraser Bot. Добавление оплаты на примере ЮКасса - PRO100 Blog

GenEraser Bot. Добавление оплаты на примере ЮКасса

Доброго времени суток! Сегодня расскажу о боте, который создавал больше для себя, а также для тестирования оплаты в телеграм. GenEraser Bot - бот, который имеет две функции: 

1. Удалять фон с изображений.

2. Генерировать изображение (на основе модели Kandinsky 3.0)

На коде бота останавливаться особо не будем, кому интересно, можете посмотреть по ссылке ниже. Сегодня же нас интересует другой момент, а именно момент оплаты.

 

Начинаем с того, что выбираем платежную систему, через которую будем производить платежи и регистрируемся там. Я выбрал ЮКасса. Осуществляем обработку платежей в коде.

 

Бота пишу с использованием библиотеки pyTelegramBotAPI, для начала нам нужно создать счет на оплату, для этого я создал отдельную функцию send_invoice, в котором создается счёт.

 

main.py

def send_invoice(message, price, title, label, description, product_id):
    prices = [LabeledPrice(label=label, amount=price)]
    try:
        bot.send_invoice(
            chat_id=message.chat.id,
            title=title,
            description=description,
            invoice_payload=f"Product_id_{product_id}",
            provider_token=config('PAYMENT_TOKEN'),
            currency='RUB',
            prices=prices,
            start_parameter='example-invoice-x5rc5da5'
        )
    except Exception as err:
        print(f'{datetime.now().strftime("%d/%m/%Y %H:%M")} - {err}')
        bot.reply_to(message, f"Произошла ошибка: {str(err)}")

в ней мы уже вызываем метод bot.send_invoice, который имеет такие параметры:

chat.id - id чата с текущим пользователем

title - название платежа

description - описание платежа

invoice_payload - payload платежа

provider_token -токен платёжной системы, покажу позже, как мы его получим

currency - валюта

prices - цена, где label - название, amount - цена, в самой маленькой единице валюты, например, у меня в копейках, так как валюта рубль

start_parameter - параметры платежа (произвольная строка)

Итак, когда пользователь подтвердит платёж, Telegram пришлёт вам webhook с Update, который содержит объект PreCheckoutQuery. На этот запрос нужно ответить в течение 10 секунд, вызвав метод answerPreCheckoutQuery. (Из документации ЮКасса).

 

main.py

@bot.pre_checkout_query_handler(func=lambda query: True)
def checkout(pre_checkout_query):
    try:
        bot.answer_pre_checkout_query(
            pre_checkout_query_id=pre_checkout_query.id,
            ok=True
        )
    except Exception as err:
        print(f'{datetime.now().strftime("%d/%m/%Y %H:%M")} - {err}')
        bot.answer_pre_checkout_query(
            pre_checkout_query_id=pre_checkout_query.id,
            ok=False,
            error_message="Произошла ошибка при обработке платежа"
        )

Можно также в этой функции реализовать проверку заказа, но у меня просто ответ. После успешного платежа, бот пришлет следующий вебхук SuccessfulPayment. Мы теперь можем отследить это событие и сделать нужные действия. У меня, к примеру, это начисление монеток.

 

main.py

@bot.message_handler(content_types=['successful_payment'])
def got_payment(message):
    payload = message.successful_payment.invoice_payload
    update_tokens(message.chat.id, (get_tokens(message.chat.id) + int(payload[-1])))
    bot.send_message(
        message.chat.id,
        f"Оплата прошла успешно! Спасибо за покупку!"
        f"\n----------\nВаши монетки: {get_tokens(message.chat.id)} 💰",
        reply_markup=main_buttons
    )

На этом моменте с кодом мы разобрались, теперь покажу, как получить токен для платежной системы.

Переходим в телеграм в @BotFather. Там выбираем своего бота, кнопка "Payments":

Нажимаем на кнопку

Выбираем нужную систему для оплаты, у меня это ЮКасса:

ЮКасса

Коннектимся, если нужно протестировать систему, выбираем ТЕСТ, если уже есть готовый магазин на сервисе ЮКасса, то выбираем LIVE. Магазин должен работать по API в документации от ЮКасса это подробно описано.

Дальше, вас перебросит в бота от ЮКассы, где вы должны дать доступ к своим данным. Даём доступ и возвращаемся в @BotFather, имеем тот самый платёжный токен.

Токен

Как раз его нужно скопировать и вставить в наш код. На этом всё, всем хорошего кодинга, а я буду браться за свой новый пет-проект.

Следите за новостями, подписывайтесь на мой телеграм-канал. Заходите на мой сайт, там много интересного.

 

P.S. Кому интересно, бота можно глянуть по ссылке.

Ссылка на проект