содержание
Практическое задание: Создание распределенной системы оплаты услуг
Система оплаты состоит из нескольких независимых участников:
- потребитель услуг
- поставщик услуг
- процессинговый центр
- агент (терминалы оплаты)
Краткое описание системы: независимые поставщики услуг (Мегафон, ТЕЛЕ2, Эр-телеком...) заключают договора с потребителями (физические лица). Для облегчения оплаты услуг существуют независимые процессинговые центры (Киберплат, ОСМП) и подключенные к ним агенты с терминалами оплаты.
Технические задания на элементы системы:
- для всех обязательное логгирование, тестирование и документирование;
- визуальный интерфейс это окно, нарисованное с помощью tkinter или PyQT (можно использовать и другие библиотеки)
- хранение данных: JSON, SQLite...
- POST-запросы отправляются с помощью модуля requests (примеры есть в лекциях)
- пример простого HTTP-сервера с базовой авторизацией есть в лекциях
- весь обмен по HTTP с Basic Authentication (базовой авторизацией)
Потребитель
- заключает договора (получает номер телефона или договора, УРЛ для получения услуги и протокол взаимодействия) с произвольным количеством поставщиков
- в визуальном интерфейсе ведет список договоров (добавление/редактирование/удаление) и эмулирует пользование услугами (кнопочки "позвонить"/"выйти в интернет" в зависимости от выбранного поставщика). Для эмуляции пользования услугой соответствующему поставщику отправляется POST-запрос (параметры задаются при заключении договора).
- хранит данные о договорах в файле
Поставщик
- предоставляет визуальный интерфейс для заключения договора с потребителем (получить ФИО, паспорт, е-майл; выдать уникальный идентификатор (телефон/договор), УРЛ и протокол обмена)
- хранит данные поставищиков в базе данных
- заключает договор на оплату услуг с произвольным количеством процессинговых центров (предоставляет УРЛ своего HTTP-сервера, логин/пароль для авторизации, поля для заполнения при оплате с регулярными выражениями для проверки)
- HTTP-сервер для эмуляции оказания услуг потребителям (все транзакции сохраняются в базе данных) и проверки наличия телефона/номера процессинговым центром (логгируются)
- дополнительно: формирование отчета по оказанным услугам в Excel и отправка на электронную почту потребителя
Процессинговый центр
- предоставляет визуальный интерфейс для заключения договора с поставщиками (получить УРЛ, логин/пароль для авторизации, протокол обмена для проверки номера и зачисления баланса, поля с регулярками) и агентами (предоставить уникальный номер договора, логин/пароль доступа к процессингу, протокол обмена, задать комиссию процессинга, пополнить баланс)
- хранит данные о поставщиках, агентах и транзакциях в базе данных
- HTTP-сервер для приема запросов от агентов
- POST-запросы поставщикам
- проксирование запросов проверки номера
- зачисление баланса (заворачивать в транзакцию)
- дополнительно: отчеты итоговые и по транзакциям в Excel для поставщиков и агентов
Агенты
- заключение договора с процессингом (получение УРЛа, логина/пароля...)
- Визуальный интерфейс (обязательно на CEF) для эмуляции оплаты потребителем
- POST-запросы процессингу
- получение списка поставщиков с реквизитами для оплаты (раз в 30 мин)
- получение баланса агента раз в 5 мин (при нулевом балансе блокировать работу терминала)
- проверка номера перед оплатой
- транзакция после оплаты (номер, сумма...), с учетом комиссии агента
- хранить данные о транзакциях в базе данных
- дополнительно: подключить реальный купюроприемник CashCode CCNET (реализовать протокол обмена по СОМ-порту и события приема денег)
ЧТО ДЕЛАТЬ?
- установите Python, Visual Studio Code (VSC)
- создайте на диске папку для проекта
- в VSC откройте папку проекта и создайте в ней файл test.py
- следуя подсказкам VSC установите расширение для Питона и линтер
- творите...
Как установить Qt Designer
В лекциях написана команда pip install pyqt5
, но она устанавливает только фреймворк, для установки designer-а установите pip install pyqt5-tools
На некоторых компьютерах может выдать ошибку "недостаточно прав", там же будет и подсказка, что установить можно только для текущего пользователя с ключом --user
pip install pyqt5-tools --user
Динамическое создание класса
При реализации процессинга возник вопрос как работать с поставщиками (список поставщиков динамический и заранее неизвестно название класса)
Родил такую иерархию:
классы поставщиков лежат в подкаталоге providers
providers\
beeline.py
mts.py
подкаталог providers оформлен как модуль, для этого в него добавляется служебный файл __init__.py
, в котором для каждого отлаженного поставщика добавляется импорт
#__init__.py
from providers.beeline import Beeline
...
теперь в основном модуле мы просто импортируем все объекты из модуля providers и при этом классы, которые мы импортировали в __init__.py
, попадают в глобальную область видимости и мы можем создавать экземпляры нужных классов:
# main.py
from providers import *
if __name__ == "__main__":
# название класса поставщика мы берем из базы или конфига, главное что здесь он в виде строки
provider_name = 'Beeline'
#globals() возвращает список объектов
provider = globals()[provider_name]()
содержание