Bibliotecas PHP para comercio electrónico: trabajando con ATOL y Payture, analizando códigos GS1 y otras tareas

Hola, mi nombre es Pavel Savelyev, soy el jefe del departamento de automatización de procesos de negocios en Lamoda. Trabajamos con tareas muy diferentes e intentamos elegir las herramientas más convenientes para cada una. En consecuencia, utilizamos diferentes idiomas: en nuestros sistemas puede encontrar Java, Go y un poco de Kotlin para Android. Al mismo tiempo, una parte importante del desarrollo se lleva a cabo en PHP; se escriben más de dos docenas de servicios que automatizan no solo el trabajo con pedidos, sino también los procesos operativos de una amplia red de entrega, centros de llamadas en tres países y nuestro propio estudio fotográfico, además de proporcionar todo esto en forma servicios a nuestros socios B2B. Estos servicios están respaldados y desarrollados por 5 equipos de desarrollo de nuestro departamento.

imagen

A medida que los servicios mismos y la infraestructura que los rodea se desarrollan, tareas similares surgen con mayor frecuencia en estos sistemas, como iniciar sesión en el CLS (Sistema de registro centralizado) común, probar el almacenamiento de archivos, recopilar métricas para Prometheus y otros. Intentamos estandarizar formas de resolver tales problemas y utilizar componentes comunes para diferentes sistemas.

Cuando uno de los equipos se enfrenta a la adaptación o integración de un nuevo servicio / herramienta que puede ser común para todos, iniciamos el desarrollo de la biblioteca en este equipo. Y luego el componente terminado se prepara para su futura reutilización y se presenta en el dominio público.

Por lo tanto, este proceso se lleva a cabo regularmente con nosotros, creamos una directriz que nos permite llevarlo a cabo sin problemas. Intentaré informar sobre esto en una de las próximas conferencias.

Más de dos docenas de nuestras bibliotecas PHP se han hecho públicas en GitHub. Y planeamos extendernos aún más. Por qué Bueno, invertimos muchos recursos y (quiero creer) lo hicimos bien. Y astutamente esperamos que otros desarrolladores usen nuestras bibliotecas, les ayuden a terminar y desarrollar más, en lugar de perder tiempo escribiendo sus análogos desde cero. En este artículo, quiero hablar brevemente sobre siete bibliotecas diseñadas para resolver tareas comunes para el comercio electrónico. Estaré encantado si son útiles para usted, y estaré aún más feliz de desarrollarlas conjuntamente :)

1. Fiscalización en línea: un cliente para ATOL Online


Al igual que otras empresas rusas, estamos obligados a cumplir plenamente con los requisitos de FZ-54, uno de los cuales es la fiscalización en línea. Todos los pedidos prepagos en lamoda.ru siempre se fiscalizan: generan cheques en línea que se envían a los clientes. Nuestro servicio de fiscalización funciona por API con el sistema ATOL Online, y la primera biblioteca de nuestra lista es un cliente completo para este servicio. Además de la biblioteca en sí, también publicamos un paquete , con el que puede conectarlo fácilmente a cualquier proyecto basado en el marco de Symfony. La biblioteca en sí se puede incrustar en cualquier otro marco PHP: Laravel, Yii, etc., simplemente escriba un "contenedor" para la biblioteca.

2. Pagos prepagos: interacción con Payture


Para procesar pagos prepagos, interactuamos activamente con el servicio Payture. Este servicio tiene varias interfaces de software. Usamos la opción Payture InPay y hemos escrito nuestro propio cliente API para ello. La biblioteca le permite manipular múltiples terminales, admite el registro estándar de PSR-3. También es posible utilizar el cliente Guzzle preconfigurado, lo que facilita la organización de las pruebas con el Guzzle Mock Handler .

Nuestro paquete de biblioteca proporciona una configuración semántica de terminales y le permite configurar convenientemente la configuración del cliente (hasta ahora solo tiempos de espera) para varias operaciones de API.

3. Etiquetado del producto: analizador de código GS1 Datamatrix


Uno de los proyectos más importantes de 2019 en nuestra empresa es el apoyo al etiquetado estatal de productos. Como parte de este proyecto, se aplicarán códigos únicos especiales a todos los productos de ciertas categorías, en el formato GS1 Datamatrix. Estos códigos permitirán a cualquier comprador verificar la autenticidad de los productos, su origen e historial. Para que los sistemas internos de Lamoda funcionen con estos códigos de barras, hemos desarrollado una biblioteca para el análisis correcto de los códigos GS1.
En el futuro cercano, también planeamos diseñar los códigos fuente de nuestros clientes desarrollados para interactuar con el Sistema de Información de Marcado y Trazabilidad (IP MP).

4. Gestión de microservicios: middleware para el bus del equipo Tactician


Tenemos más de un centenar de microservicios que realizan muchas operaciones separadas: comprueban el estado de los pagos o los archivos nuevos almacenados, envían comandos de control a los cajeros, descargan y procesan fotografías de servicios externos. Casi todas estas operaciones se realizan en segundo plano, y el patrón del bus de comando es excelente para administrarlas. Para implementar el bus en sistemas PHP, elegimos una solución preparada: la biblioteca abierta de Tactician .

Sin embargo, surgió un problema: nuestros equipos de fondo a menudo interactúan con servicios externos, que tienen un límite en la cantidad de operaciones en n segundos. Y Tactician no tiene la capacidad de controlar la cantidad de comandos ejecutables en una ventana de tiempo específica. Por lo tanto, desarrollamos un middleware adicional: la biblioteca de límite de velocidad táctico . Con su ayuda, puede agregar una nueva capa de procesamiento que rastrea el número de comandos ejecutados en el bus de acuerdo con la estrategia de limitación de velocidad seleccionada. Las estrategias son conectables, las estrategias de la biblioteca de stiphle están disponibles de fábrica .

También en el dominio público está nuestro paquete Symfony para la biblioteca.

5. Recopilación y representación de métricas para Prometheus


Nuestros microservicios generan métricas técnicas y comerciales, que luego se recopilan a través del operador Prometheus de todo el clúster k8s. Para gestionar todo esto, escribimos una biblioteca que procesa métricas personalizadas de acuerdo con el escenario "collect-save-show". Al mismo tiempo, la biblioteca admite modos operativos en los que se puede omitir uno de los elementos del script para aumentar la eficiencia. Por ejemplo, para métricas computables rápidas, se puede ejecutar un escenario simplificado de "recopilación-presentación". Y trabajar con métricas comerciales lentas puede traducirse parcialmente en segundo plano, mientras se divide en dos etapas: "recopilar-guardar" + "recopilar (desde el almacenamiento) - mostrar".

La biblioteca tiene los niveles necesarios de abstracción tanto para escribir sus generadores métricos como para escribir repositorios. Fuera de la caja hay un adaptador abstracto para Doctrine, que se puede configurar en la entidad para guardar datos en la base de datos.

Como formatos de renderizado métrico, prometheus y telegraf httpjson son actualmente compatibles.

La biblioteca viene con un paquete de Symfony, que proporciona una configuración semántica de fuentes de métricas, repositorios y métricas de enrutamiento. También tiene comandos de ayuda para depurar y guardar métricas de fuentes (por ejemplo, para calcular métricas cron).

6. Prueba del almacenamiento de archivos: trabajar con diferentes sistemas de archivos


Para automatizar las pruebas, utilizamos el marco de Codeception , que nos permite escribir pruebas de varios niveles y tiene una biblioteca bastante extensa de módulos estándar. Recientemente escribimos más sobre nuestros enfoques para el desarrollo de pruebas en un artículo separado y hablamos en una conferencia PHP Rusia . Codeception tiene módulos listos para interactuar con FTP y el FileSystem local, pero en nuestras pruebas existe la necesidad de trabajar con más sistemas de archivos. Como mínimo, también utilizamos AWS S3 y Webdav. Además, me gustaría interactuar con todos los sistemas de archivos utilizando la misma API (esto es todos los sistemas de archivos :)).

Afortunadamente, hay una biblioteca FlySystem abierta que proporciona una única interfaz de software para trabajar con diferentes sistemas de archivos. Por lo tanto, solo necesitábamos combinar las dos herramientas, lo que hicimos escribiendo un contenedor sobre FlySystem como un módulo Codeception-flysystem . Ahora es compatible con SFTP, S3 y Webdav. Es suficiente configurar los ajustes una vez para conectarse al sistema de archivos deseado en la configuración de prueba yml, y después de eso puede trabajar con todos los sistemas de archivos utilizando el mismo conjunto de métodos: escribir el archivo, copiar el archivo, limpiar el directorio, etc. El módulo ya está incluido en la página de adiciones y recomendaciones de Codeception: codeception.com/addons .

7. Trabajar con variables de entorno en modo multiinquilino


En el departamento de automatización de procesos de negocios, existen sistemas que operan en modo multiinquilino. Para garantizar su trabajo, es necesario poder trabajar con variables de entorno, para determinar qué variable usar en el momento actual.

Nuestra biblioteca proporciona varias estrategias para trabajar con variables de entorno en modo multiinquilino. En función de los parámetros pasados ​​en la etapa de inicialización, la biblioteca determina a qué variable de entorno se debe acceder en la solicitud actual.

Para continuar


Esta es solo la primera parte de las bibliotecas. Tenemos una docena más adentro: están esperando en la fila cuando los "peinamos" un poco y los ponemos en el dominio público. Me motiva comprender que estas bibliotecas pueden ser útiles para otra persona. Me alegro de los comentarios y las estrellas en el github, y espero continuar desarrollando bibliotecas con otros desarrolladores. De hecho, muchos proyectos de comercio electrónico de Rusia trabajan con ATOL y Payture. Para Datamatrix, además del analizador de código descrito en el artículo, también tenemos un par de clientes que ya utilizamos internamente: estas bibliotecas son las primeras en la cola en GitHub.

Tratamos de no olvidarnos de los otros idiomas: ya hemos publicado la primera biblioteca en Go ( escribimos más sobre esto aquí en Habré ) y estamos preparando otros. Estén atentos!

Source: https://habr.com/ru/post/466039/


All Articles