• Что-бы увидеть скрытые разделы и познать все тайны форума, Вам необходимо Зарегистрироваться или Войти.
  • Сюда попадают темы НЕ ПРОШЕДШИЕ ПРОВЕРКУ или темы, которые нарушают правила форума. Не советуем покупать здесь что-либо!

Подключение платёжки к любому телеграм боту | Python, telebot

Статус
В этой теме нельзя размещать новые ответы.

Kevin Atlas

Местный
Статус
offline
Регистрация
18.10.2018
Сообщения
105
Репутация
64
Йо, время от времени встречаю тут темки, в которых люди спрашивают как подключить платёжку. Так как я давно ботов делаю, у меня есть уже готовый файл для быстрого подключения платёжки, решил поделиться.

Используются модули:

  • pyTelegramBotAPI
  • cherrypy
  • hashlib


В файле есть класс для генерации ссылок на 4.5 платёжки
  • QIWI
  • YANDEX
  • YANDEX (только картой)
  • FREE-KASSA
  • ANY-PAY (мои любимые)
Чтобы подключить киви нам нужен токен и номер https://qiwi.com/api
Чтобы подключить яндекс нам тоже нужен токен и номер кошелька, но достать его чуть сложнее https://yandex.ru/dev/money/apps/
Чтобы подключить кассу нам нужен аккаунт, айди магазина и секретное слово из него https://www.free-kassa.ru/docs/api.php
Чтобы подключить эни-пей нам нужен айди магаза и секретное слово https://anypay.io/doc/sci

Ссылки я дал, по ним нужную инфу найдёте, я покажу код на примере подключения кассы.
У нас есть файл pk.py (pk от слова paykey)
В нём содержится класс Pay, так что импортируем его
Python:
from pk import Pay

Теперь, когда нам нужно принять оплату от чела, мы шлём ему сообщение, а как клавиатуру вставляем такой параметр
Python:
Pay().paykey(sum, id, kassa, text, sal)

sum --- сумма платежа
id ----- айдишка платежа, которую вы будете обрабатывать (чаще всего я ставлю туда юзер айди)
kassa - номер нашего магазина в фри-кассе
text --- текст, который будет на кнопке
sal ---- скидка, когда например юзер ввёл скидочный промокод (необязательный параметр)

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

Допустим у вас уже есть сервер и фри-касса знает куда слать хуки.

Я лично использую cherrypy, так что покажу пример на нём
Сначала создаём переменные с данными по нашему серверу:
Python:
WEBHOOK_HOST =      '165.22.57.201'
WEBHOOK_PORT =      88  # 443, 80, 88 или 8443 (порт должен быть открыт!)
WEBHOOK_LISTEN =    '165.22.57.201'  # На некоторых серверах придется указывать такой же IP, что и выше

WEBHOOK_SSL_CERT =  './webhook_cert.pem'  # Путь к сертификату
WEBHOOK_SSL_PRIV =  './webhook_pkey.pem'  # Путь к приватному ключу

WEBHOOK_URL_BASE =  "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH =  "/%s/" % (token)

Далее, в конце кода создаём экземпляр класса сервера, функцию называем index, дописываем ей *args и **kwargs
Python:
class WebhookServer(object):
    @cherrypy.expose
    def index(self, *args, **kwargs):
И теперь, чтобы понять что хуки идут от кассы, я использую проверку IP
Создаём список с айпишками которые я нашёл в документации и ставим на него проверку:

Python:
ips = ['136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '136.243.38.108']

        if cherrypy.request.headers['Remote-Addr'] in ips:

Далее просто смотрим какие параметры передаёт нам фри-касса ( ) и делаем с ними что хотим.
Как пример, получить сумму заказа можно через kwargs['AMOUNT']

Потом, когда написали всю обработку, на одном уровне с ифом проверки айпишника добавляем
Python:
        elif 'content-length' in cherrypy.request.headers and \
                        'content-type' in cherrypy.request.headers and \
                        cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            # Эта функция обеспечивает проверку входящего сообщения
            bot.process_new_updates([update])
            return ''

        else:
            raise cherrypy.HTTPError(403)
Это позволит боту принимать хуки от телеграма и выполнять их.

В конце просто пересоздаём вебхук и запускаем сервер!
Код:
bot.remove_webhook()

bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH, certificate=open(WEBHOOK_SSL_CERT, 'r'))
                
cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})

# Собственно, запуск!
cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

Таким образом полный код сервера будет такой:
Python:
class WebhookServer(object):
    @cherrypy.expose
    def index(self, *args, **kwargs):
        ips = ['136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '136.243.38.108']

        if cherrypy.request.headers['Remote-Addr'] in ips:
            # тут обрабатываем данные

        elif 'content-length' in cherrypy.request.headers and \
                        'content-type' in cherrypy.request.headers and \
                        cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            # Эта функция обеспечивает проверку входящего сообщения
            bot.process_new_updates([update])
            return ''

        else:
            raise cherrypy.HTTPError(403)

bot.remove_webhook()

bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH, certificate=open(WEBHOOK_SSL_CERT, 'r'))
                
cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})

# Собственно, запуск!
cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

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

Вложения

  • pk.zip
    972 байт · Просмотры: 200

Kevin Atlas

Местный
Статус
offline
Регистрация
18.10.2018
Сообщения
105
Репутация
64
Пост поздний был, так что один ап)0
 

Doc Type

Новичок
Статус
offline
Регистрация
19.01.2020
Сообщения
6
Репутация
3
Йо, время от времени встречаю тут темки, в которых люди спрашивают как подключить платёжку. Так как я давно ботов делаю, у меня есть уже готовый файл для быстрого подключения платёжки, решил поделиться.

Используются модули:

  • pyTelegramBotAPI
  • cherrypy
  • hashlib


В файле есть класс для генерации ссылок на 4.5 платёжки
  • QIWI
  • YANDEX
  • YANDEX (только картой)
  • FREE-KASSA
  • ANY-PAY (мои любимые)
Чтобы подключить киви нам нужен токен и номер https://qiwi.com/api
Чтобы подключить яндекс нам тоже нужен токен и номер кошелька, но достать его чуть сложнее https://yandex.ru/dev/money/apps/
Чтобы подключить кассу нам нужен аккаунт, айди магазина и секретное слово из него https://www.free-kassa.ru/docs/api.php
Чтобы подключить эни-пей нам нужен айди магаза и секретное слово https://anypay.io/doc/sci

Ссылки я дал, по ним нужную инфу найдёте, я покажу код на примере подключения кассы.
У нас есть файл pk.py (pk от слова paykey)
В нём содержится класс Pay, так что импортируем его
Python:
from pk import Pay

Теперь, когда нам нужно принять оплату от чела, мы шлём ему сообщение, а как клавиатуру вставляем такой параметр
Python:
Pay().paykey(sum, id, kassa, text, sal)

sum --- сумма платежа
id ----- айдишка платежа, которую вы будете обрабатывать (чаще всего я ставлю туда юзер айди)
kassa - номер нашего магазина в фри-кассе
text --- текст, который будет на кнопке
sal ---- скидка, когда например юзер ввёл скидочный промокод (необязательный параметр)

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

Допустим у вас уже есть сервер и фри-касса знает куда слать хуки.

Я лично использую cherrypy, так что покажу пример на нём
Сначала создаём переменные с данными по нашему серверу:
Python:
WEBHOOK_HOST =      '165.22.57.201'
WEBHOOK_PORT =      88  # 443, 80, 88 или 8443 (порт должен быть открыт!)
WEBHOOK_LISTEN =    '165.22.57.201'  # На некоторых серверах придется указывать такой же IP, что и выше

WEBHOOK_SSL_CERT =  './webhook_cert.pem'  # Путь к сертификату
WEBHOOK_SSL_PRIV =  './webhook_pkey.pem'  # Путь к приватному ключу

WEBHOOK_URL_BASE =  "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH =  "/%s/" % (token)

Далее, в конце кода создаём экземпляр класса сервера, функцию называем index, дописываем ей *args и **kwargs
Python:
class WebhookServer(object):
    @cherrypy.expose
    def index(self, *args, **kwargs):
И теперь, чтобы понять что хуки идут от кассы, я использую проверку IP
Создаём список с айпишками которые я нашёл в документации и ставим на него проверку:

Python:
ips = ['136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '136.243.38.108']

        if cherrypy.request.headers['Remote-Addr'] in ips:

Далее просто смотрим какие параметры передаёт нам фри-касса ( ) и делаем с ними что хотим.
Как пример, получить сумму заказа можно через kwargs['AMOUNT']

Потом, когда написали всю обработку, на одном уровне с ифом проверки айпишника добавляем
Python:
        elif 'content-length' in cherrypy.request.headers and \
                        'content-type' in cherrypy.request.headers and \
                        cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            # Эта функция обеспечивает проверку входящего сообщения
            bot.process_new_updates([update])
            return ''

        else:
            raise cherrypy.HTTPError(403)
Это позволит боту принимать хуки от телеграма и выполнять их.

В конце просто пересоздаём вебхук и запускаем сервер!
Код:
bot.remove_webhook()

bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH, certificate=open(WEBHOOK_SSL_CERT, 'r'))
                
cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})

# Собственно, запуск!
cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

Таким образом полный код сервера будет такой:
Python:
class WebhookServer(object):
    @cherrypy.expose
    def index(self, *args, **kwargs):
        ips = ['136.243.38.147', '136.243.38.149', '136.243.38.150', '136.243.38.151', '136.243.38.189', '136.243.38.108']

        if cherrypy.request.headers['Remote-Addr'] in ips:
            # тут обрабатываем данные

        elif 'content-length' in cherrypy.request.headers and \
                        'content-type' in cherrypy.request.headers and \
                        cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            # Эта функция обеспечивает проверку входящего сообщения
            bot.process_new_updates([update])
            return ''

        else:
            raise cherrypy.HTTPError(403)

bot.remove_webhook()

bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH, certificate=open(WEBHOOK_SSL_CERT, 'r'))
                
cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})

# Собственно, запуск!
cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

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

cojiomoh

Новичок
Статус
offline
Регистрация
08.11.2020
Сообщения
0
Репутация
0
Здраствуйте! Я не понимаю кусок кода

WEBHOOK_HOST = '165.22.57.201'
WEBHOOK_PORT = 88 # 443, 80, 88 или 8443 (порт должен быть открыт!)
WEBHOOK_LISTEN = '165.22.57.201' # На некоторых серверах придется указывать такой же IP, что и выше

WEBHOOK_SSL_CERT = './webhook_cert.pem' # Путь к сертификату
WEBHOOK_SSL_PRIV = './webhook_pkey.pem' # Путь к приватному ключу

WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (token)

Где достать эти данные?
 

Kevin Atlas

Местный
Статус
offline
Регистрация
18.10.2018
Сообщения
105
Репутация
64
Здраствуйте! Я не понимаю кусок кода

WEBHOOK_HOST = '165.22.57.201'
WEBHOOK_PORT = 88 # 443, 80, 88 или 8443 (порт должен быть открыт!)
WEBHOOK_LISTEN = '165.22.57.201' # На некоторых серверах придется указывать такой же IP, что и выше

WEBHOOK_SSL_CERT = './webhook_cert.pem' # Путь к сертификату
WEBHOOK_SSL_PRIV = './webhook_pkey.pem' # Путь к приватному ключу

WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (token)

Где достать эти данные?
Очевидно айпишник своего сервера
 
Статус
В этой теме нельзя размещать новые ответы.