Conectar um ERP com ecommerce e um gateway de pagamento exige mais do que “fazer um endpoint”. Exige contratos claros, autenticação robusta, tratamento de erros previsível e webhooks idempotentes. Sem isso, cada integração nova vira dívida técnica.
Este artigo descreve o design de APIs REST para integrações servidor a servidor entre ERP, lojas online e gateways como Yappy, BAC ou Paguelo Fácil.
Princípios de design
- Contratos explícitos: cada endpoint documenta request, response e códigos de erro.
- Idempotência: reenviar um POST não duplica pedidos nem cobranças.
- Versionamento: breaking changes vão para
/v2/, sem patches silenciosos. - Autenticação mínima: scopes por recurso, nunca credenciais em query strings.
- Observabilidade: correlation ID em cada request para rastrear fluxos cross-system.
Estrutura de recursos
Padrão recomendado para ecommerce + ERP:
| Recurso | Métodos | Propósito |
|---|---|---|
/v1/orders | POST, GET | Criar e consultar pedidos |
/v1/orders/{id}/status | PATCH | Atualizar status (com validação) |
/v1/products/sync | POST | Sincronizar catálogo do ERP |
/v1/webhooks/payment | POST | Receber confirmação do gateway |
/v1/inventory/{sku} | GET | Consultar estoque em tempo real |
Autenticação servidor a servidor
- API keys com scopes mínimos (somente leitura de estoque, somente escrita de pedidos).
- HMAC em webhooks: o receptor valida assinatura com secret compartilhado.
- OAuth2 client credentials quando o provedor exige (SAP, alguns ERPs cloud).
- Rotação de keys documentada; nunca em repos nem em imagens Docker.
Webhooks vs polling
Webhooks para eventos de negócio: pagamento confirmado, estoque atualizado, envio despachado. O emissor notifica; o receptor valida assinatura, persiste e responde 200.
Polling só como fallback ou quando o sistema externo não suporta callbacks. Sempre com backoff exponencial e limite de reintentos.
Tratamento de erros
Respostas consistentes facilitam a integração:
{
"error": {
"code": "ORDER_NOT_FOUND",
"message": "Order 12345 does not exist",
"correlation_id": "abc-123"
}
}
- Códigos HTTP semânticos: 400 (input inválido), 401 (auth), 404 (não existe), 409 (conflito/idempotência), 429 (rate limit), 500 (erro interno).
- Nunca expor stack traces nem queries SQL em produção.
correlation_idem header e body para suporte cross-system.
Resiliência quando o ERP está fora do ar
- O ecommerce cria o pedido localmente com status
pending_sync. - Um job em fila tenta sincronizar com o ERP com reintentos e backoff.
- Se falhar após N tentativas, vai para dead-letter queue e alerta a equipe.
- O cliente vê confirmação do pedido; a sincronização é reconciliada depois.
Versionamento sem quebrar clientes
/v1/na URL ou headerAccept-Version: 1.- OpenAPI/Swagger publicado e atualizado a cada release.
- Política de depreciação: aviso 90 dias antes de remover um endpoint.
- Testes de contrato (Pact ou similar) entre consumidor e provedor.
Checklist de integração
- Contrato documentado (OpenAPI) com exemplos de request/response.
- Autenticação com scopes mínimos e rotação de keys.
- Idempotência em POST de criação (header
Idempotency-Key). - Webhooks com validação HMAC e reintentos do emissor.
- Filas para sincronização async com dead-letter.
- Logs com correlation ID, sem PII nem secrets.
- Rate limiting em endpoints públicos.
- Ambientes separados (sandbox/prod) com credenciais distintas.
Conecte com integrações, pagamentos no Panamá e proteção de APIs .