Uma API REST robusta e escalável para processamento de pagamentos usando Stripe, implementada em Go com Clean Architecture.
- ✅ Criação e Autorização de Pagamentos: Criação de Payment Intents com autorização automática
- ✅ Captura Manual: Captura de fundos autorizados quando necessário
- ✅ Cancelamento: Cancelamento de autorizações não capturadas
- ✅ Consulta de Pagamentos: Busca detalhada de pagamentos por ID
- ✅ Webhooks do Stripe: Processamento automático de eventos do Stripe
- ✅ Rate Limiting: Proteção contra abuso com rate limiting configurável
- ✅ Circuit Breaker: Proteção contra falhas com padrão circuit breaker
- ✅ Logging Estruturado: Observabilidade completa com Zap
- ✅ Validação Robusta: Validação de entrada com go-playground/validator
- ✅ Graceful Shutdown: Encerramento gracioso do servidor
O projeto segue os princípios da Clean Architecture, com separação clara de responsabilidades:
├── cmd/api/ # Ponto de entrada da aplicação
├── internal/
│ ├── domain/ # Entidades e regras de negócio
│ │ └── payment/ # Domínio de pagamentos
│ ├── app/ # Casos de uso e orquestração
│ │ ├── service/ # Serviços de aplicação
│ │ ├── saga/ # Padrão Saga para transações
│ │ └── ports/ # Interfaces/Contratos
│ └── infra/ # Infraestrutura e adapters
│ ├── http/ # HTTP handlers, middleware, routers
│ ├── stripe/ # Cliente Stripe
│ ├── repo/ # Repositórios de dados
│ ├── config/ # Configuração da aplicação
│ └── logger/ # Logging estruturado
└── pkg/ # Utilitários compartilhados
└── ulidx/ # Geração de ULIDs
- Go 1.24.5 - Linguagem de programação
- Gin Framework - Framework HTTP rápido e minimalista
- Stripe Go SDK - Integração oficial com Stripe
- Zap - Logging estruturado de alta performance
- Go Playground Validator - Validação de estruturas
- ULID - Identificadores únicos ordenáveis
- Circuit Breaker - Padrão de resiliência
- Rate Limiting - Controle de taxa de requisições
Crie um arquivo .env na raiz do projeto com as seguintes variáveis:
# Configuração da Aplicação
APP_ENV=dev
HTTP_PORT=8080
LOG_LEVEL=info
# Rate Limiting
RATE_LIMIT_RPS=10
RATE_LIMIT_BURST=20
REQUEST_TIMEOUT=15s
# Stripe Configuration
STRIPE_SECRET_KEY=sk_test_seu_secret_key_aqui
STRIPE_WEBHOOK_SECRET=whsec_seu_webhook_secret_aqui
STRIPE_ENABLE_TEST_PM=true
STRIPE_TEST_PAYMENT_METHOD=pm_card_visa
# Circuit Breaker
CB_MAX_REQUESTS=3
CB_INTERVAL=60s
CB_TIMEOUT=8s- Criar conta no Stripe: https://stripe.com
- Obter chaves de API: Acesse o Dashboard → Developers → API keys
- Configurar webhook:
- URL:
https://seu-dominio.com/webhooks/stripe - Eventos:
payment_intent.succeeded,payment_intent.payment_failed - Copie o signing secret para
STRIPE_WEBHOOK_SECRET
- URL:
- Go 1.24.5 ou superior
- Conta no Stripe (teste ou produção)
- Clone o repositório:
git clone https://github.com/williamkoller/golang-payment-stripe.git
cd golang-payment-stripe- Instale as dependências:
go mod download- Configure as variáveis de ambiente:
cp .env.example .env
# Edite o arquivo .env com suas configurações- Execute a aplicação:
go run cmd/api/main.goA API estará disponível em http://localhost:8080
http://localhost:8080/v1
POST /v1/payments
Cria um novo pagamento e realiza a autorização automática.
curl -X POST http://localhost:8080/v1/payments \
-H "Content-Type: application/json" \
-d '{
"amount": 5500,
"currency": "brl",
"email": "cliente@example.com"
}'Resposta:
{
"id": "01HXYZ123ABC456DEF789GHI",
"amount": 5500,
"currency": "brl",
"email": "cliente@example.com",
"status": "authorized",
"stripe_payment_intent_id": "pi_1ABC123def456GHI",
"client_secret": "pi_1ABC123def456GHI_secret_xyz",
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:00Z"
}POST /v1/payments/{id}/capture
Captura os fundos de um pagamento autorizado.
curl -X POST http://localhost:8080/v1/payments/01HXYZ123ABC456DEF789GHI/capturePOST /v1/payments/{id}/cancel
Cancela a autorização de um pagamento não capturado.
curl -X POST http://localhost:8080/v1/payments/01HXYZ123ABC456DEF789GHI/cancelGET /v1/payments/{id}
Obtém os detalhes de um pagamento específico.
curl http://localhost:8080/v1/payments/01HXYZ123ABC456DEF789GHIPOST /webhooks/stripe
Endpoint para receber eventos do Stripe (configurado automaticamente).
Cliente → API → Stripe → API → Cliente
- Valida dados de entrada
- Cria Payment Intent no Stripe
- Retorna client_secret para o frontend
- Status:
authorized
Merchant → API → Stripe → Webhook → API
- Captura fundos autorizados
- Atualiza status via webhook
- Status:
captured
Merchant → API → Stripe → API
- Cancela autorização não capturada
- Libera reserva no cartão do cliente
- Status:
canceled
| Status | Descrição |
|---|---|
created |
Pagamento criado, aguardando autorização |
authorized |
Autorizado, aguardando captura |
captured |
Fundos capturados com sucesso |
canceled |
Autorização cancelada |
failed |
Falha no processamento |
refunded |
Pagamento reembolsado |
- RPS: 10 requisições por segundo (configurável)
- Burst: 20 requisições em rajada (configurável)
- Verificação de assinatura do Stripe
- Proteção contra replay attacks
- Validação de timestamp
- Validação rigorosa de todos os parâmetros
- Sanitização de dados de entrada
- Tratamento seguro de erros
- Max Requests: 3 falhas consecutivas
- Interval: 60 segundos
- Timeout: 8 segundos
- Timeout configurável para requisições
- Tratamento de erros com context
- Propagação adequada de cancelamentos
- Logs estruturados em JSON
- Níveis configuráveis (debug, info, warn, error)
- Correlação de requests com trace IDs
- Logging de performance de requests
- Rastreamento de erros e falhas
- Monitoramento de circuit breaker
# Executar todos os testes
go test ./...
# Testes com coverage
go test -cover ./...
# Testes com verbose
go test -v ./...-
Erro de autenticação Stripe
- Verifique se
STRIPE_SECRET_KEYestá correto - Confirme se está usando a chave do ambiente correto (test/live)
- Verifique se
-
Webhook não funcionando
- Verifique se
STRIPE_WEBHOOK_SECRETestá correto - Confirme se a URL do webhook está acessível
- Teste a conectividade:
curl -X POST sua-url/webhooks/stripe
- Verifique se
-
Rate limit atingido
- Ajuste
RATE_LIMIT_RPSeRATE_LIMIT_BURST - Implemente retry com backoff no cliente
- Ajuste
Desenvolvido com ❤️ por William Koller