практика.md 9.1 KB

содержание

Практическое задание: Создание распределенной системы оплаты услуг

Система оплаты состоит из нескольких независимых участников:

  • потребитель услуг
  • поставщик услуг
  • процессинговый центр
  • агент (терминалы оплаты)

Краткое описание системы: независимые поставщики услуг (Мегафон, ТЕЛЕ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]()
    

содержание