Bibliotecas PHP para comércio eletrônico: trabalhando com ATOL e Payture, analisando códigos GS1 e outras tarefas

Olá, meu nome é Pavel Savelyev, sou o chefe do departamento de automação de processos de negócios da Lamoda. Trabalhamos com tarefas muito diferentes e tentamos escolher as ferramentas mais convenientes para cada uma. Conseqüentemente, usamos linguagens diferentes - em nossos sistemas, você pode encontrar Java, Go e um pouco de Kotlin para Android. Ao mesmo tempo, uma parte significativa do desenvolvimento é conduzida em PHP; nele são escritas mais de duas dúzias de serviços que automatizam não apenas o trabalho com pedidos, mas também os processos operacionais de uma ampla rede de entrega, call centers em três países e nosso próprio estúdio de fotografia, além de fornecer tudo isso na forma serviços aos nossos parceiros B2B. Esses serviços são suportados e desenvolvidos por 5 equipes de desenvolvimento de nosso departamento.

imagem

À medida que os próprios serviços e a infraestrutura ao redor deles se desenvolvem, tarefas semelhantes ocorrem com mais frequência nesses sistemas, como efetuar login no CLS (Sistema de Log Centralizado) comum, testar o armazenamento de arquivos, coletar métricas para o Prometheus e outros. Tentamos padronizar maneiras de resolver esses problemas e usar componentes comuns para diferentes sistemas.

Quando uma das equipes se depara com a adaptação ou integração de um novo serviço / ferramenta que pode se tornar comum a todos, iniciamos o desenvolvimento da biblioteca nessa equipe. E o componente final é preparado para reutilização futura e apresentado em domínio público.

Portanto, como esse processo ocorre regularmente conosco, criamos uma diretriz que nos permite conduzi-lo com menos esforço - tentarei relatar isso em uma das próximas conferências.

Mais de duas dúzias de nossas bibliotecas PHP foram disponibilizadas publicamente no GitHub. E planejamos nos espalhar ainda mais. Porque Bem, investimos muitos recursos e (quero acreditar) se saíram bem. Esperamos astutamente que outros desenvolvedores usem nossas bibliotecas, os ajudem a finalizar e a desenvolver mais, em vez de gastar tempo escrevendo seus análogos do zero. Neste artigo, quero falar brevemente sobre sete bibliotecas projetadas para resolver problemas comuns para tarefas de comércio eletrônico - ficarei feliz se elas forem úteis para você e ficarei ainda mais feliz em desenvolvê-las juntas :)

1. Fiscalização online: um cliente para o ATOL Online


Como outras empresas russas, somos obrigados a cumprir totalmente os requisitos do FZ-54, um dos quais é a fiscalização online. Todos os pedidos pré-pagos no lamoda.ru são sempre fiscalizados: eles geram cheques on-line que são enviados aos clientes. Nosso serviço de fiscalização funciona pela API com o sistema ATOL Online, e a primeira biblioteca da nossa lista é um cliente completo para esse serviço. Além da própria biblioteca, também publicamos um pacote , com o qual você pode conectá-lo facilmente a qualquer projeto baseado na estrutura do Symfony. A própria biblioteca pode ser incorporada em qualquer outra estrutura PHP: Laravel, Yii, etc. - basta escrever um "wrapper" para a biblioteca.

2. Pagamentos pré-pagos: interação com o Payture


Para processar pagamentos pré-pagos, interagimos ativamente com o serviço Payture. Este serviço possui várias interfaces de software. Usamos a opção Payture InPay e criamos nosso próprio cliente de API para isso. A biblioteca permite manipular vários terminais, suporta o registro PSR-3 padrão. Também é possível usar o cliente Guzzle pré-configurado - isso facilita a organização de testes usando o Guzzle Mock Handler .

Nosso pacote de bibliotecas fornece uma configuração semântica de terminais e permite que você defina convenientemente as configurações do cliente (até o momento, apenas o tempo limite) para várias operações da API.

3. Rotulagem do produto: Analisador de código GS1 Datamatrix


Um dos projetos mais importantes de 2019 em nossa empresa é o suporte à rotulagem estadual de mercadorias. Como parte deste projeto, códigos exclusivos especiais serão aplicados a todos os produtos de determinadas categorias - no formato GS1 Datamatrix. Esses códigos permitirão a qualquer comprador verificar a autenticidade dos produtos, sua origem e histórico. Para que os sistemas internos da Lamoda funcionem com esses códigos de barras, desenvolvemos uma biblioteca para a análise correta dos códigos GS1.
Em um futuro próximo, também planejamos definir os códigos-fonte de nossos clientes desenvolvidos para interação com o Sistema de Informações de Marcação e Rastreabilidade (IP MP).

4. Gerenciamento de microsserviços: middleware para o ônibus da equipe Tactician


Temos mais de cem microsserviços que realizam muitas operações separadas: eles verificam o status dos pagamentos ou novos arquivos nos armazenamentos, enviam comandos de controle aos caixas, fazem o download e processam fotos de serviços externos. Quase todas essas operações são executadas em segundo plano, e o padrão do barramento de comando é excelente para gerenciá-las. Para implementar o barramento em sistemas PHP, escolhemos uma solução pronta - a biblioteca Tactician aberta.

No entanto, surgiu um problema: nossas equipes de segundo plano costumam interagir com serviços externos, que têm um limite no número de operações em n segundos. E o Tactician não tem a capacidade de controlar o número de comandos executáveis ​​em uma janela de tempo específica. Portanto, desenvolvemos um middleware adicional - biblioteca de limites de taxas Tactician . Com sua ajuda, você pode adicionar uma nova camada de processamento que rastreia o número de comandos executados no barramento de acordo com a estratégia de limitação de taxa selecionada. As estratégias são conectáveis, as estratégias da biblioteca stiphle estão disponíveis na caixa .

Também no domínio público está o nosso pacote Symfony para a biblioteca.

5. Coletando e Renderizando Métricas para o Prometheus


Nossos microsserviços geram métricas técnicas e de negócios, que são coletadas pelo Prometheus Operator de todo o cluster k8s. Para gerenciar tudo isso, escrevemos uma biblioteca que processa métricas personalizadas de acordo com o cenário "coletar, salvar e mostrar". Ao mesmo tempo, a biblioteca suporta modos operacionais nos quais um dos itens de script pode ser omitido para aumentar a eficiência. Por exemplo, para métricas computáveis ​​rápidas, um cenário simplificado de "exibição em coleta" pode ser executado. E o trabalho com métricas de negócios lentas pode se traduzir parcialmente em segundo plano, dividindo-se em dois estágios: “coleta-salvamento” + “coleta (do armazenamento) - exibição”.

A biblioteca possui os níveis de abstração necessários, tanto para escrever seus geradores de métricas quanto para escrever repositórios. Fora da caixa, há um adaptador abstrato para o Doctrine, que pode ser configurado na entidade para salvar dados no banco de dados.

Como formatos de renderização métrica, o prometheus e o telegraf httpjson atualmente são suportados.

A biblioteca vem com um pacote Symfony, que fornece uma configuração semântica de fontes de métricas, repositórios e métricas de roteamento. Ele também possui comandos auxiliares para depuração e salvamento de métricas de fontes (por exemplo, para calcular métricas cron).

6. Testando o armazenamento de arquivos: trabalhando com diferentes sistemas de arquivos


Para automatizar o teste, usamos a estrutura de Codeception , que nos permite escrever testes de vários níveis e possui uma biblioteca bastante extensa de módulos padrão. Escrevemos mais sobre nossas abordagens para testar o desenvolvimento recentemente em um artigo separado e conversamos em uma conferência do PHP Rússia . A codecepção possui módulos prontos para interagir com o FTP e o sistema de arquivos local, mas em nossos testes é necessário trabalhar com mais sistemas de arquivos. No mínimo, também usamos o AWS S3 e o Webdav. Além disso, eu gostaria de interagir com todos os sistemas de arquivos usando a mesma API (todos os sistemas de arquivos :)).

Felizmente, existe uma biblioteca FlySystem aberta que fornece uma única interface de software para trabalhar com diferentes sistemas de arquivos. Portanto, precisamos apenas combinar as duas ferramentas - o que fizemos escrevendo um invólucro no FlySystem como um módulo de sistema de codecpção-flysystem . Agora ele suporta SFTP, S3 e Webdav. Basta definir as configurações uma vez para conectar-se ao sistema de arquivos desejado na configuração de teste yml e, depois disso, você pode trabalhar com todos os sistemas de arquivos usando o mesmo conjunto de métodos: escreva, copie, limpe o diretório, etc. O módulo já está incluído na página de adições e recomendações de Codeception: codeception.com/addons .

7. Trabalhando com variáveis ​​de ambiente no modo multilocatário


No departamento de automação de processos de negócios, existem sistemas que operam no modo multilocatário. Para garantir seu trabalho, é necessário poder trabalhar com variáveis ​​de ambiente - para determinar qual variável usar no momento atual.

Nossa biblioteca fornece várias estratégias para trabalhar com variáveis ​​de ambiente no modo multilocatário. Com base nos parâmetros passados ​​no estágio de inicialização, a biblioteca determina qual variável de ambiente deve ser acessada na solicitação atual.

Para ser continuado


Esta é apenas a primeira parte das bibliotecas. Temos mais uma dúzia lá dentro - eles estão esperando na fila quando os “penteamos” um pouco e os colocamos em domínio público. Isso me motiva a entender que essas bibliotecas podem ser úteis para outra pessoa. Eu me alegro com os comentários e as estrelas no github e espero continuar desenvolvendo bibliotecas com outros desenvolvedores. De fato, muitos projetos russos de comércio eletrônico trabalham com ATOL e Payture. Para o Datamatrix, além do analisador de código descrito no artigo, também temos alguns clientes que já usamos internamente - essas bibliotecas são as primeiras da fila no GitHub.

Tentamos não esquecer os outros idiomas - já publicamos a primeira biblioteca no Go ( escrevemos mais sobre isso aqui no Habré ) e estamos preparando outros. Fique atento!

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


All Articles