Доброго времени суток! Сегодня расскажу о боте, который создавал больше для себя, а также для тестирования оплаты в телеграм. 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. Кому интересно, бота можно глянуть по ссылке.