Как сделать оплату в телеграмме боту python
Перейти к содержимому

Как сделать оплату в телеграмме боту python

  • автор:

Реализация оплаты в телеграмм боте

Необходимо реализовать оплату в телеграмм боте, что для этого необходимо и какая платёжная система или сервис приёма платежей подойдёт без открытия ООО/ИП.

Отслеживать
задан 15 июл 2021 в 14:54
27 1 1 серебряный знак 7 7 бронзовых знаков

Я не осведомлён в этой теме, поэтому, если кто-то может просветить, будьте добры или подкиньте материалы для чтения

15 июл 2021 в 14:58

необходимо почитать статью 171 УК РФ. Осуществление предпринимательской деятельности без регистрации или без лицензии либо без аккредитации в национальной системе аккредитации наказывается штрафом в размере до трехсот тысяч рублей или в размере заработной платы или иного дохода осужденного за период до двух лет, либо обязательными работами на срок до четырехсот восьмидесяти часов, либо арестом на срок до шести месяцев.

15 июл 2021 в 15:27
@Интик Вообще-то существует такое понятие как «самозанятый».
15 июл 2021 в 16:56

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

15 июл 2021 в 17:58
Телеграм-бот Donate позволяет принимать оплату во многих валютах, в том числе и в крипте
8 сен 2022 в 20:42

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Платёжные боты существуют в Telegram с 2017 года. С их помощью можно безопасно оплачивать товары и услуги вроде доставки пиццы, не покидая приложения.

Для оплаты можно использовать любое приложение – в том числе Telegram для компьютеров. Покупатель также может оставить чаевые, чтобы поддержать любимого автора, кафе или магазин.

Платформа для платежей открытая и бесплатная – Telegram не берёт комиссии и не хранит платежную информацию. Реквизиты отправляются напрямую платежной системе, а адрес для доставки — продавцу, чтобы он мог отправить товар.

Испытать возможности на бесплатных тестовых товарах и услугах можно в этом канале.

На данный момент Telegram поддерживает платежи из более чем 200 стран через следующие платежные системы:

  • Stripe
  • YooMoney (ЮSelf — бесплатный сервис для самозанятых)
  • Sberbank
  • Tranzzo
  • Payme
  • CLICK
  • LiqPay
  • ECOMMPAY
  • PayMaster

Для подключения оплаты:

  1. у @BotFather выберите своего бота
  2. Перейдите в раздел Payments
  3. Выберите платёжного провайдера
  4. Для разработки и отладки выберите Connect *** TEST
  5. Для «боевой» среды выберите Connetct *** LIVE
  • Описание пошагового процесса оплаты
  • Описание API
  • Пример реализации с помощью pyTelegramBotAPI
  • Пример реализации с помощью Telethon

Урок №12. Подключение системы оплаты в telegram боте

В этом уроке мы добавим платежную систему для оформления платежей внутри нашего telegram бота.

Интеграция системы оплаты.

Для подключения системы оплаты мы должны перейти в BotFather и прописать команду /mybots. За счет этой команды мы можем выполнить редактирование наших ботов. Выбираем нашего бота. Тут мы можем узнать токен нашего бота, отредактировать его и так далее. Нас же интересует такая кнопка, как Payments, то есть настройка платежей в боте.

Telegram позволяет настроить сразу несколько различных систем оплаты для вашего бота. Также важно, что для настройки какой-либо систем платежей вы должны быть зарегистрированы в самой этой системе. Я буду регистрировать такую систему как ЮKassa. Если мы хотим подключить основную систему оплаты, то заходите на сайт ЮKassa, в организации и вводите свои данные, и буквально через 1 день вам пришлют договор с подписанием контракта с ЮKassa. Мы же пока подключим с вами тестовый магазин в нашем боте. Для этого в BotFather мы выбираем ЮKassa.

Теперь если у вас уже подключена основная система оплаты, то нажимаем на кнопку Connect ЮKassa Live. В моем случае я подключаю тестовый магазин, поэтому нажимаю на кнопку Connect ЮKassa Test. Далее нас перебрасывает в бота юкассы. Нажимаем кнопку start. Далее бот нас просит отправить ему идентификатор нашего магазина. Бот сформирует вам его и останется только переслать это число ему в ответ. Далее он попросит скинуть ваш shopArticleId, который он также сам сгенерирует. После чего ЮKassa зарегистрирует ваш тестовый магазин в BotFather.

Теперь возвращаемся в BotFather, где уже зарегистрирована наша платежная система. Он выводит нам токен, по которому м теперь сможем проводить оплату.

Импортируем токен в программу

Добавляем наш токен в файл token.csv, где у нас уже храниться token нашего бота. Сохраняем его в переменную, например, PAYMENT_TOKEN.

Теперь мы можем описать код, за счет которого мы будем высылать счет на оплату пользователю и при нажатии на специальную кнопку пользователь сможет перейти на систему оплаты и выполнить платеж через нашего бота.

Создание счета (invoice).

Давайте теперь напишем код, за счет которого мы будем высылать invoice пользователю. По сути это будет счет для оплаты и при нажатии на специальную кнопку, пользователь будет переходить на систему оплаты и выполнить платеж. Давайте будет отправлять пользователю счет для оплаты, когда нам будет приходить такая команда, как /pay. Так как в прошлом уроке мы работали с библиотекой aiogram, чтобы закрепить то, что мы узнали, продолжим работать на ней.

Мы обращаемся к диспетчеру (то есть объекту dis), затем обращаемся к message_handler() и также указываем commands = [‘pay’]. Затем мы должны создать функцию, например, payment. В функции мы указываем параметр message и указываем тип этого параметра. Для этого ставим двоеточие, затем указываем types и тип этого параметра, то есть message. Теперь давайте отправим счет нашему пользователю. Для этого прописываем await bot.send_invoise. Данная функция принимает много параметров, давайте разберемся в них. Первым параметром передаем message.chat.id.

Title, где указываем название нашего товара.

Description — в нем мы пишем описание к нашему товару.(является не обязательным в передаче)

Provider_token, тут же мы обращаемся к нашему csv файлу и берем из него PAYMENT_TOKEN.

Currency необходимо передать трехзначный код валюты в формате ISO 4217. Полный список валют можно найти здесь.

Photo_url мы должны передать ссылку на наше фото(является не обязательным в передаче) Если вы добавили фото, то нужно указать параметры photo_height и photo_width, иначе изображение либо вообще не отобразится, либо отобразится некорректно.

Is_flexible отвечает за то, что финальная цена зависит от способа доставки (когда передаем True). При значении False этот параметр можно не писать.

Prices принимает массив из цен, поэтому передаем туда [price]. Переменную price мы напишем чуть позже.

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

Payload. Объем 1-128 байт. Рекомендуется использовать его для того чтобы идентифицировать инвойсы — он не показывается пользователю, но мы можем его прочитать при получении успешной оплаты.

Сейчас при запуске у нас будет выдаваться ошибка, так как у нас неизвестная переменная price. Давайте создадим ее. Для этого перед диспетчером мы пишем переменную price, куда должны указать цену товара. Мы обращаемся к types, к LabeledPrice(). Далее в label мы указываем название товара, а в amount передаем стоимость.

ВАЖНО! Нужно передавать целочисленное значение в минимально возможных единицах валюты. То есть если мы говорим о рублях, то передавать нужно копейки (123руб. как 123* 100).

Теперь при запуске бота и отправке команды /pay, нашему пользователю будет отправляться счет на оплату.

Коротко про платежи через ботов в Telegram

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

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

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

Особенности платежей 2.0

Тelegram впервые представил платежи через ботов в 2017 году. Эта функция позволяла ботам отправлять счета пользователям. Пользователи могли вводить данные своей карты непосредственно в чате для осуществления покупок.

В этих ранних версиях функциональность платежей была довольно ограничена. Например, не было поддержки инлайн-режима, что означало, что все платежные операции должны были проходить внутри чата с ботом.

Платежи обрабатывались через сторонние платежные провайдеры, такие как Stripe, Yandex.Money, и другие. Telegram не обрабатывал платежи напрямую, а лишь предоставлял платформу для их интеграции.

Payments 2.0 представляет собой расширенный функционал для отправки счетов. Разработчики теперь могут включать в счета дополнительную информацию, такую как фотографии товаров, описание, и даже предоставлять покупателям различные варианты товаров или услуг прямо в счете. Это делает процесс покупки более наглядным и удобным.

Самая крутая фича Payments 2.0 — поддержка inline mode. Это позволяет пользователям быстро и легко осуществлять покупки прямо в процессе общения в любом чате или группе, используя inline запросы. Разработчикам в свою очередь предоставляется возможность создавать более динамичные и вовлекающие покупательские сценарии.

Также разработчики могут внедрить функцию принятия чаевых. Это открывает дополнительный канал дохода для контент-создателей и сервисов, предоставляя пользователям возможность оценить их работу небольшими финансовыми взносами.

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

Также расширили регионы оплаты.

Шаги работы платежного процесса

Создание счета

Создание счета в осуществляется через метод sendInvoice , который является частью Bot API.

Метод sendInvoice используется для отправки счетов пользователям. Этот метод требует ряда параметров, включая ID чата, заголовок счета, описание, payload, провайдера для обработки платежей, сведения о цене и валюте.

Параметры API

chat_id : Уникальный идентификатор пользователя или группы.

title : Название продукта или услуги.

description : Описание продукта или услуги.

payload : Уникальный идентификатор транзакции.

provider_token : Токен, полученный от платежного провайдера.

start_parameter : Строковый параметр для глубоких ссылок.

currency : Валюта транзакции.

prices : Массив цен, каждый элемент которого содержит label (название) и amount (стоимость в минимальных единицах валюты, например, копейках или центах).

Допустим, вы хотите отправить счет за покупку книги. Ваш код может выглядеть примерно так:

from telegram import LabeledPrice, Bot bot = Bot(token='ВАШ_TELEGRAM_BOT_TOKEN') chat_id = 'CHAT_ID_ПОЛЬЗОВАТЕЛЯ' title = 'Название Книги' description = 'Описание книги' payload = 'Уникальный_Payload_Транзакции' provider_token = 'TOKEN_ПЛАТЕЖНОГО_ПРОВАЙДЕРА' start_parameter = 'start' currency = 'RUB' # Валюта prices = [LabeledPrice('Цена Книги', 10000)] # Цена в копейках bot.send_invoice(chat_id, title, description, payload, provider_token, start_parameter, currency, prices)
Выбор способа оплаты пользователем

После получения счета пользователь выбирает способ оплаты. Telegram не обрабатывает платежи от пользователей напрямую, а вместо этого использует различных платежных провайдеров по всему миру. Эти провайдеры отвечают за обработку и хранение всех конфиденциальных данных, таких как детали кредитной карты. Ни Telegram, ни разработчики ботов не имеют доступа к этой информации. На данный момент Telegram поддерживает платежи из более чем 200 стран через ряд платежных провайдеров, включая Stripe, YooMoney, Sberbank и другие.

Каждая платежная система предоставляет уникальный токен (provider token), который используется при создании счетов (invoices) через бота.

Обработка платежа

Когда пользователь подтверждает детали платежа, бот получает запрос предпроверки ( pre_checkout_query ). Бот должен ответить на этот запрос, используя метод answerPreCheckoutQuery , чтобы подтвердить, что все детали платежа корректны.

После успешного выполнения платежа боту отправляется обновление ( update ) с подтверждением успешной транзакции. Это обновление содержит уникальный идентификатор транзакции ( telegram_payment_charge_id ) и идентификатор транзакции провайдера ( provider_payment_charge_id ).

from telegram.ext import PreCheckoutQueryHandler def pre_checkout_callback(update, context): query = update.pre_checkout_query if query.invoice_payload != 'Ожидаемый_Payload': # Ответить с ошибкой, если payload не совпадает query.answer(ok=False, error_message="Ошибка в данных платежа.") else: # Подтвердить предпроверку query.answer(ok=True) # Добавить обработчик PreCheckoutQueryHandler в диспетчер dispatcher.add_handler(PreCheckoutQueryHandler(pre_checkout_callback))

В примере pre_checkout_callback функция проверяет invoice_payload и подтверждает предпроверку платежа.

Получение уведомления о статусе платежа

После того, как пользователь завершает процесс оплаты, бот получает уведомление о статусе платежа. Это уведомление включает в себя все детали транзакции, включая идентификатор платежа.

Бот должен подтвердить получение уведомления о платеже, что является финальным этапом процесса.

Завершение транзакции

Когда платеж успешно обработан платежным провайдером, бот получает уведомление successful_payment от Telegram. Это уведомление содержит все данные о транзакции, включая идентификаторы платежей и сумму.

После обработки успешного платежа, важно отправить пользователю подтверждение, например, сообщение с благодарностью или информацией о доставке товара.

Можно записывать информацию о транзакции в вашей базе данных для дальнейшей обработки и отчетности.

API платежей

Разберем парочку функций из апи. Подробнее с документацией можете ознакомиться официальной страницы API.

sendInvoice используется для отправки счетов пользователям. Вот пример JSON-запроса:

< "chat_id": 123456789, "title": "Название товара", "description": "Описание товара", "payload": "BotPayload", "provider_token": "ProviderToken", "currency": "USD", "prices": [], "max_tip_amount": 1000, "suggested_tip_amounts": [100, 200, 300], "start_parameter": "start", "provider_data": "ProviderData", "photo_url": "http://example.com/photo.jpg", "need_name": true, "need_shipping_address": true >

createInvoiceLink используется для создания ссылки на счет. Пример запроса:

Если вы отправили счет с запросом адреса доставки, используйте метод answerShippingQuery для ответа. Пример:

После того как пользователь подтвердит свои платежные и доставочные данные, нужно использовать answerPreCheckoutQuery для ответа на запрос. Пример:

LabeledPrice: Этот объект используется для определения цены на товар или услугу. Например:

ShippingOption: Описывает вариант доставки для товара. Пример:

SuccessfulPayment: Содержит подтверждение успешной оплаты. Пример:

Про ЮKassa

Юкасса — хороший вариант для оплаты в ботах. Предположим, что вы уже зарегистрировались в ЮKassa и имеете все необходимые ключи и токены. В ЮKassa и получите shopId и secretKey .

Когда пользователь выбирает что-то для покупки, вы создаете счет в ЮKassa и отправляете пользователю кнопку для оплаты:

import requests from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.ext import Updater, CommandHandler, CallbackQueryHandler SHOP_ID = 'your_shop_id' SECRET_KEY = 'your_secret_key' BOT_TOKEN = 'your_bot_token' def start(update, context): # Ваш код для отображения товаров и/или услуг def create_invoice(update, context): chat_id = update.message.chat_id # Сумма и описание покупки amount = description = 'Описание покупки' headers = < 'Idempotence-Key': 'unique_key', # Уникальный ключ для предотвращения дублирования транзакций 'Content-Type': 'application/json', 'Authorization': 'Basic ' + SHOP_ID + ':' + SECRET_KEY >payload = < 'amount': amount, 'capture': True, 'confirmation': < 'type': 'embedded' >, 'description': description > response = requests.post('https://payment.yandex.net/api/v3/payments', json=payload, headers=headers) payment_info = response.json() # Отправка сообщения с кнопкой для оплаты keyboard = [[InlineKeyboardButton("Оплатить", url=payment_info['confirmation']['confirmation_url'])]] reply_markup = InlineKeyboardMarkup(keyboard) update.message.reply_text('Пожалуйста, оплатите ваш заказ:', reply_markup=reply_markup) def main(): updater = Updater(BOT_TOKEN, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("buy", create_invoice)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

Также нужно настроить webhook в ЮKassa для получения уведомлений о статусе платежей. Ваш сервер должен принимать и обрабатывать эти уведомления.

Фича с оплатой в телеге только обеспечивает удобный способ совершения покупок и оплаты услуг, а также значительно расширяет возможности использования Telegram как инструмента для бизнеса.

Также рекомендую вам ознакомиться с нашими другими статьями про телеграм-ботов:

  1. Масштабирование телеграм-ботов на примере aiogram
  2. Как управлять состоянием телеграм-бота
  3. Разработка высокопроизводительного кеш-слоя на основе Redis в телеграм-боте
  4. 9 архитектурных антипаттернов при разработке телеграм-ботов на Python
  5. Как сделать вашего телеграм-бота лучше? Конечно, добавить ему аналитику

А получить практические навыки по архитектуре приложений вы традиционно можете в рамках онлайн-курсов от моих коллег из OTUS. Переходите в каталог и выбирайте подходящий курс.

  • python
  • телеграм боты
  • программирование

Прием платежей в крипто валютах в Telegram боте через WalletPay и Python/Flask

Криптовалюты в Telegram

Бот Telegram @wallet недавно предоставил API для приема платежей в сторонних Telegram ботах. Из крипто валют поддерживаются BTC, TON, USDT.

Необходимо зарегистрироваться на сайте, предоставить сведения о подключаемом к API боте, пройти процедуру идентификации (биометрия для физических лиц), дождаться одобрения заявки и назначения размера комиссии для ваших платежей. У меня процедура заняла чуть более суток.

После одобрения заявки получаете доступ в личный кабинет, где нужно сгенерировать ключ для доступа к API WalletPay.

После этого можно приступать к продажам. Покупателю нужно предоставить ссылку для оплаты через WalletPay товаров/услуг вашего бота. Код для получения этой ссылки может быть таким.

import requests def get_pay_link(): headers = < 'Wpay-Store-Api-Key': 'YOUR-API-KEY', 'Content-Type': 'application/json', 'Accept': 'application/json', >payload = < 'amount': < 'currencyCode': 'USD', # выставляем счет в долларах США 'amount': '1.00', >, 'description': 'Goods and service.', 'externalId': 'XXX-YYY-ZZZ', # ID счета на оплату в вашем боте 'timeoutSeconds': 60 * 60 * 24, # время действия счета в секундах 'customerTelegramUserId': '999666999', # ID аккаунта Telegram покупателя 'returnUrl': 'https://t.me/mybot', # после успешной оплаты направить покупателя в наш бот 'failReturnUrl': 'https://t.me/wallet', # при отсутствии оплаты оставить покупателя в @wallet > response = requests.post( "https://pay.wallet.tg/wpay/store-api/v1/order", json=payload, headers=headers, timeout=10 ) data = response.json() if (response.status_code != 200) or (data['status'] not in ["SUCCESS", "ALREADY"]): logging.warning("# code: %s json: %s", response.status_code, data) return '' return data['data']['payLink'] 

Счет можно выставлять в долларах США, евро или рублях. Пересчет в BTC, TON, USDT будет выполнен по курсу WalletPay.

Для подтверждения факта оплаты счета, WalletPay предоставляет две опции:

  • периодический опрос состояния счета с вашей стороны.
  • POST-запрос на указанный вами в личном кабинете https адрес (webhook в терминах WalletPay).

Я использовал второй вариант. Код обработчика вебхука может быть таким.

from flask import Flask, request app = Flask(__name__) @app.route('/tgwallet/ipn', methods=['POST']) def ipn_tgwallet(): for event in request.get_json(): if event["type"] == "ORDER_PAID": data = event["payload"] print("Оплачен счет N <> на сумму <> <>. Оплата <> <>.".format( data["externalId"], # ID счета в вашем боте, который мы указывали при создании ссылки для оплаты data["orderAmount"]["amount"], # Сумма счета, указанная при создании ссылки для оплаты data["orderAmount"]["currencyCode"], # Валюта счета data["selectedPaymentOption"]["amount"]["amount"], # Сколько оплатил покупатель data["selectedPaymentOption"]["amount"]["currencyCode"] # В какой криптовалюте )) # нужно всегда возвращать код 200, чтобы WalletPay не делал повторных вызовов вебхука return 'OK' 

Прежде чем передавать оплаченный товар или услугу, нужно убедиться, что вызов вебхука пришел из WalletPay, а не от злоумышленников, жаждущих заполучить наш товар бесплатно.

Для этого WalletPay предлагает две опции:

  • проверка принадлежности IP вызова к пулу IP адресов WalletPay;
  • проверка хеша, вычисленного на основе данных вызова вебхука и вашего ключа API.

Список IP адресов WalletPay можно найти в документации, а для проверки хеша можно использовать следующий код.

import base64, hashlib, hmac ENCODING = 'utf-8' def is_valid(flask_request): text = '.'.join([ flask_request.method, # 'POST' flask_request.path, # нужно использовать часть адреса без имени домена, '/tgwallet/ipn' в нашем случае flask_request.headers.get('WalletPay-Timestamp'), base64.b64encode(flask_request.get_data()).decode(ENCODING), ]) signature = base64.b64encode(hmac.new( bytes('YOUR-API-KEY', ENCODING), msg=bytes(text, ENCODING), digestmod=hashlib.sha256 ).digest()) return flask_request.headers.get('Walletpay-Signature') == signature.decode(ENCODING) 

Затем использовать функцию is_valid для проверки в обработчике вебхука.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *