Case de Engenharia

SPD Sistema de Pagamentos Digitais

Microsserviço serverless de pagamentos do OQTEM Food, integrando o Pagar.me com split nativo.

Python 3.11AWS LambdaDynamoDBSQS / SNSPagar.me (PSP)HexagonalTerraformCI/CDpytest
SPD — Digital Payments System

O OQTEM Food precisava de pagamentos digitais confiáveis e em conformidade legal. A integração antiga com o Mercado Pago era incompatível com a Lei 12.865/2013, e pagamento é um sistema distribuído: retries acontecem, dado de cartão é sensível e cobrança dupla não pode existir. Era preciso um serviço isolado, testável e à prova de falhas — sem acoplar a regra de negócio à infraestrutura nem ao provedor de pagamento.

SPD — Digital Payments System

O Laravel é o único caller: chama o Lambda (núcleo hexagonal) via API Gateway, que usa adapters para Pagar.me, DynamoDB e SNS/SQS; o estado final do pagamento volta por webhook assíncrono.

  1. 01
    Arquitetura hexagonal (ports & adapters)

    O núcleo — domain e usecases — é Python puro, sem importar boto3 ou httpx; ele só conhece interfaces (ports). As tecnologias concretas (Pagar.me, DynamoDB, SNS) vivem como adapters plugáveis, e os handlers Lambda são finos (~20 linhas, só I/O e wiring). Trocar de PSP ou de banco é trocar um adapter, não a regra.

  2. 02
    Serverless na AWS

    Python 3.11 em Lambda, com DynamoDB, SQS, SNS e API Gateway — escala sob demanda, custo por uso e sem servidor para manter.

  3. 03
    Infra como código (Terraform) e CI/CD

    Toda a infra serverless — Lambda, DynamoDB, SQS, SNS e API Gateway — é provisionada com Terraform (infra como código), reproduzível e versionada. O pipeline de CI/CD roda a suíte de testes (pytest, moto, respx) e faz o deploy automatizado.

  4. 04
    Idempotência e estado assíncrono

    Toda cobrança usa Idempotency-Key e o webhook deduplica por event.id — retries não geram cobrança dupla. O estado final do pagamento chega sempre por webhook, nunca pela response da requisição.

  5. 05
    Zero PAN/CVV no backend

    O backend nunca toca em número de cartão ou CVV: a tokenização é obrigatória no client e o serviço só guarda um pagarme_card_id opaco. O webhook é autenticado por Basic Auth (ADR-006), e o Laravel é o único caller — nenhuma rota aceita chamada direta do mobile.

  6. 06
    Pagar.me como PSP (split + conformidade)

    Escolhi o Pagar.me V5 como PSP (não como gateway) pelo split de pagamento nativo e pela conformidade com a Lei 12.865/2013 — exatamente o que faltava na integração anterior com o Mercado Pago.

Testável sem subir AWS

Como domain e usecases não dependem de infra, a lógica de negócio é testável em milissegundos com fakes — sem subir AWS. Os testes usam pytest, moto (mock da AWS) e respx (mock de HTTP), cobrindo os invariantes críticos: nunca tocar em dado de cartão, idempotência em toda cobrança e pagamento como assíncrono confirmado por webhook.

O resultado é um microsserviço de pagamentos isolado, em conformidade legal e resiliente a retries: a regra de negócio sobrevive a mudanças de infra ou de PSP, o cartão nunca trafega pelo backend e a cobrança dupla é impossível por construção. Serverless, escala sob demanda e paga só pelo uso.

0k+usuários na plataforma de delivery

Vamos conversar sobre seu projeto?

Próximo casePróton