Как принимать платежи в Telegram API Yoomoney Python
В данном посте мы научимся принимать платежи в Telegram боте с помощью API Yoomoney.
Введение
Начну с того, что я не так давно хотел создать магазин электронных товаров в Telegram. И столкнулся с проблемой, что на момент работы не было готовых решений. Хотелось принимать платежи без ИП и всякой этой движухи. Поэтому мой выбор был между Qiwi и Yoomoney (раньше Yandex Деньги). Сам я из Беларуси... Поэтому проще получить "Идентифицированный" аккаунт было у Yoomoney.
Используем библиотеку yoomoney для Python.
Описание
Получаем токен
Для того, чтобы пользоваться API Yoomoney нужно получить специальный токен. Первым делом регистрируем приложение:
1. Зайдите в кошелек ЮMoney. Если кошелька нет, создайте его.
2. Перейдите на страницу Регистрация приложения.
3. Укажите параметры приложения:
4. Нажмите на кнопку Подтвердить.
Откроется страница Данные приложения, где будут указаны название вашего приложения, его идентификатор (client_id) и, если выбрана соответствующая опция, сгенерированное секретное слово (client_secret).
Запоминаем client_id и redirect_uri, они нам еще нужны.
Теперь самое сложное: заменяем на свои данные и запускаем код. Следуйте всем шагам программы.
Не забываем про pip install yoomoney
from yoomoney import Authorize Authorize( client_id="YOUR_CLIENT_ID", redirect_uri="YOUR_REDIRECT_URI", scope=["account-info", "operation-history", "operation-details", "incoming-transfers", "payment-p2p", "payment-shop", ] )
Проверяем токен
Заменяем YOUR_TOKEN на ваш и запускаем:
from yoomoney import Client token = "YOUR_TOKEN" client = Client(token) user = client.account_info() print("Account number:", user.account) print("Account balance:", user.balance) print("Account currency code in ISO 4217 format:", user.currency) print("Account status:", user.account_status) print("Account type:", user.account_type) print("Extended balance information:") for pair in vars(user.balance_details): print("\t-->", pair, ":", vars(user.balance_details).get(pair)) print("Information about linked bank cards:") cards = user.cards_linked if len(cards) != 0: for card in cards: print(card.pan_fragment, " - ", card.type) else: print("No card is linked to the account")
Account number: 410019014512803 Account balance: 999999999999.99 Account currency code in ISO 4217 format: 643 Account status: identified Account type: personal Extended balance information: --> total : 999999999999.99 --> available : 999999999999.99 --> deposition_pending : None --> blocked : None --> debt : None --> hold : None Information about linked bank cards: No card is linked to the account
Супер! Токен работает и можно переходить к основной части.
Как выставить счет на оплату
Для этого воспользуемся модулем Quickpay.
from yoomoney import Quickpay quickpay = Quickpay( receiver="410019014512803", quickpay_form="shop", targets="Sponsor this project", paymentType="SB", sum=150, ) print(quickpay.base_url) print(quickpay.redirected_url)
https://yoomoney.ru/quickpay/confirm.xml?receiver=410019014512803&quickpay-form=shop&targets=Sponsor%20this%20project&paymentType=SB&sum=150 https://yoomoney.ru/transfer/quickpay?requestId=343532353937313933395f66326561316639656131626539326632616434376662373665613831373636393537613336383639
Первая ссылка находится под капотом второй. Обе ведут на одну форму. Но вторая имеет свой жизненный цикл.
Оплатить можно либо картой, либо переводом из кошелька.
Теперь вопрос: Как нам определить, что именно этот человек оплатил счет?
Для этого воспользуемся параметорм label - метка, которую сайт или приложение присваивает конкретному переводу. Например, в качестве метки можно указывать код или идентификатор заказа.
И теперь наша программа будет выглядеть так:
from yoomoney import Quickpay quickpay = Quickpay( receiver="410019014512803", quickpay_form="shop", targets="Sponsor this project", paymentType="SB", sum=150, label="a1b2c3d4e5" ) print(quickpay.base_url) print(quickpay.redirected_url)
Теперь осталось только проверить оплату.
Проверка оплаты
Для этого воспользуемся основным модулем Client.
Зная label транзакции мы можем отфильтровать историю операций кошелька. Просто укажем label в client.operation_history():
from yoomoney import Client token = "YOUR_TOKEN" client = Client(token) history = client.operation_history(label="a1b2c3d4e5") print("List of operations:") print("Next page starts with: ", history.next_record) for operation in history.operations: print() print("Operation:",operation.operation_id) print("\tStatus -->", operation.status) print("\tDatetime -->", operation.datetime) print("\tTitle -->", operation.title) print("\tPattern id -->", operation.pattern_id) print("\tDirection -->", operation.direction) print("\tAmount -->", operation.amount) print("\tLabel -->", operation.label) print("\tType -->", operation.type)
В результате получаем список всех операций по нашему фильтру:
List of operations: Next page starts with: None Operation: 670278348725002105 Status --> success Datetime --> 2021-10-10 10:10:10 Title --> Пополнение с карты ****4487 Pattern id --> None Direction --> in Amount --> 150.0 Label --> a1b2c3d4e5 Type --> deposition
Теперь мы знаем прошла ли оплата.