И так в марте 2022 Steam отключила в российском сегменте Steam все основные способы оплаты для пользователей из России.У игроков осталось 3 пути: Продавать вещи со своего инвентаря. Покупать ключи и аккаунты в сомнительных магазинах.   Возиться с QIWI для перевода через Тенге. Я на тот момент активно изучал новый для себя язык Python, и решил потренироваться создав бота позволяющего быстро и просто пополнять пользователям пополнять свой steam аккаунт. Сразу приложу ссылку на репозиторий, в котором храниться этот проект и оговорюсь что его поддержку я закончил несколько месяце назад в связи с участившимся отказом QIWI в переводах на Steam через API, якобы из-за недостатка средств на балансе, при том что баланс всегда был с запасом, и вручную оплата спокойно проводилась.  Основные проблемы пользователя которые должен устранять бот. Необходимость иметь собственный QIWI кошелёк - все операции должны выполняются на уже созданном кошельке. В силу того что я не ожидал большого потока пользователей для начала я решил использовать свой личный аккаунт. Ручной перевод средств - после того как бот получал подтверждения оплаты, он должен автоматически переводить рубли в тенге и отправлять их на аккаунт пользователя используя средства предоставляемые API кошелька. Проект планировалось создать из 3х основных частейТелеграмм бот.Фронт: осуществляет интерфейс взаимодействия с пользователемБек: отправляет API запросы и анализирует ответы, обновляет данные в базеMS SQL Server.Ответственен за хранение всей информации в проекте, ниже расписаны содержащиеся в ней таблицы и назначение полей в них. No - Номер строки (ПК) TgID - Идентификатор пользователя в Телеграмм NickName - Логин пользователя в Steam KZ - Баланс тенге Logined - Флаг указывающий на выбраны в данный момент аккаунт Steam No - номер заказа (ПК) NickName - целевой аккаунт (внешний ключ к customers) RU - Количество рублей прошедших через заказ KZ - Количество тенге прошедших через заказ Status - Статус заказа Url - ссылка на форму оплаты CreateDateTime - Дата и Время создания PiadDateTime - дата и Время исполнения commission - комиссия за выполнение (в основном использовалась как поправочный коэффициент покрывающий комиссию QIWI за переводы и конвертацию валют) Name - имя QIWI кошелька (ПК) Is_default - Выбранный кошелек для операций Интеграция с QIWI API  Эта часть по сути является набором готовых методов которые можно использовать в боте для взаимодействия с кошельком.  При первом заходе пользователь вводил свой логин от аккаунта, после чего ему становится доступен основное меню, так у него на выбор несколько действий. Создать ссылку на пополнение Steam Подтвердить статус оплаты Менеджер аккаунтов При нажатии на первую опцию, пользователю предлагается выбрать сумму на которую он хочет пополнить кошелёк. После ввода желаемой суммы бот должен получить текущий кур валют, рассчитать сколько понадобиться рублей для покрытия комиссий, оправить запрос через API на создание формы оплаты QIWI, дождаться ссылки и вернуть пользователю.После произведения оплаты, пользователь может выбрать вторую опцию и проверить статус его перевода, я заложил следующие Ожидание (WAITING)  - заказ был инициализирован через API и ожидает оплаты. Оплачен (PAID) - пользователь внес средства в рублях. Конвертирован (CROSSED) - рубли были конвертированы в тенге. Исполнен (COMPLETED) - тенге были доставлены на аккаунт. И тут немного магии, именно эта кнопка и запускала сам процесс перевода, поскольку я тогда был не в силах разобраться как реализовать калбек от QIWI по факту оплаты, было решено проверять статус оплаты именно в этот момент. Если заказ застревал где-то в цепочке исполнения, эта информация передавалась пользователю, и он мог или попробовать снова протолкнуть оплату сам или воспользоваться поддержкой в лице меня :-)  Третья опция позволяла сменить аккаунт Steam на который создавались заказы, так пользователь мог пополнять кошельки не только себе но и знакомым, которые бы опасались сами использовать нового бота, и тем самым продвигая его. И так  общий план приложения намечен, можно было приступать к разработке, весь процесс я поделил на четыре стадии. Разработка интерфейса - создание основных элементов меню, навигация, предстояло продумать пользовательские сценарии. Создание обертки над API QIWI - на тот момент я не имел опыта работы с сторонними сервисами и мне предстояло создать для точки взаимодействия с API QIWI, благо на мой взгляд там достаточно хорошая документация. Создание прослойки для работы с сервером MS SQL, ох знал бы я тогда что такое ORM с экономил бы кучу времени ) Интеграция функционала в интерфейс, собственно последним этом предстояло привязать готовые наборы действий кнопкам на интерфейсе. Разработка интерфейса Первым делом разметим наборы кнопок которые будут отображаться пользователю в соответствующих меню. Реализованы они с помощью ReplyKeyboardMarkup, это шаблоны сообщений, в них не заложить логики, но они помогают наглядно указать пользователю какие действия ему сейчас доступны.  Затем нужно сделать функций для декоратора обработчика сообщений.По сути все сводится к тому, что надо определить какую команду ввел пользователь, ответить ему и заменить набор опций при необходимостиreply_markup = *набор команд*после чего указать какой из обработчиков будет взаимодействовать с этим пользователем.Bot.register_next_step_handler(*сообщение от пользователя*, *обработчик*)  Обертка над API QIWI Как уже говорил у QIWI есть хорошая документация по API с примерами использования на разных языках и ожидаемыми ответами.https://developer.qiwi.com/ru/p2p-payments/#p2p-Самое интересное тут это отправка средств на счет клиента и получение ссылки на оплату.    Тут упомяну "прикол" который может сэкономить кому-то время при разработке собственного приложения, дело в том что для обращения к некоторым методам API QIWI нужно присылать уникальный ID операции, так вот у меня этот параметр был привязан к номеру заказа, который изначально был обычным авто инкрементом в БД, что привело к падению приложения на каждом 2м заказе, дело полагаю в том что перевод на Steam из тенге по сути представляет собой 2 операции, конвертацию в доллары и уже затем перевод, из-за забиваются сразу 2 ID операции вместо одного и поэтому когда я пытался отправить тенге для второго заказа у которого ID+1 API возвращало мне ошибку "такой ID уже бы использован." Работа с сервером MS SQL Все свое общение с SQL я реализовал через 1 процедуру, которую приведу ниже, алгоритм простой, но позволял в ран тайме понимать что где и когда сработало не так.Всего в нем пара траев.Первый  был подключением к БД.Второй на получение информации.Как я уже говорил об ORM я узнал значительно позже, вследствие чего все SQL запросы я составлял ручками и не о чем не жалею, практика есть практика )Под катом также расположены методы которые я использовал для работы с заказами в БД.  Естественно часто приходилось делать "гибридные" функции, которые одновременно работают как с БД так и с API QIWI, самым простым из примеров будет обновление статуса заказа.  Интеграция функционала в интерфейс Когда все базовые взаимодействия с окружением были готовы настало время добавить их в интерфейс, это уже не составляло особого труда. Смотришь что нажал пользователь, пытаешься произвести действие, получилось ?Отлично можно двигать его дальше по интерфейсу. Произошла ошибка?Выводим оповещение с описанием ошибки, просим повторить, если ситуация хуже откатываем на предыдущую позицию в интерфейсе, если совсем все плохо, просим обратиться в поддержку. Ниже описан обработчик сообщений в меню заказа.  Бот проработал с 16 марта 2022 по 15 октября того же года (8 месяцев).За это время он помог перевести 41051р на кошельки Steam.Самая большая разовая сумма 2100р.87% пользователей первым взносом выбирали самую низкую сумму из возможных 105р.Заработано было 0р 0к, комиссию за собственный сервис я не брал. В общем это был интересный опыт по проработке собственного сервиса, который позволил мне погрузиться в мир API и SQL в купе с практикой по Python.