“Pagamento em produção é assunto sério: sem idempotência, sem deploy.” — #30DiasJava Finance Log
🎯 Objetivo do Day 9
O nono dia do #30DiasJava mergulhou em pagamentos. A meta: criar um Payment Service com ledger imutável, integrações com Stripe e MBWay e observabilidade financeira digna de auditoria.
🛠️ Destaques da implementação
- Ledger imutável: tabela
payment_ledgerguarda cada transição (AUTHORIZED,CAPTURED,REFUNDED). Nada deUPDATE— novos registros contam a história completa. - Idempotência real:
ON CONFLICT DO NOTHING+ índices únicos (provider,provider_payment_id) previnem duplicatas. Redis segura nonces de callbacks. - Webhooks seguros: Stripe usa verificação HMAC (
Stripe-Signature); MBWay valida certificados X.509 antes de processar. - Eventos financeiros: após
CAPTURED, publicamosPaymentReceivedEventpara alimentar XP, relatórios e notificações. - Reconciliação diária: job
reconcile-paymentscompara ledger × provedor e registra divergências empayment_reconciliation_issue.
💡 Lições do dia
- Tokens do provedor são o único caminho — dados de cartão nunca tocam nosso banco.
- Auditoria exige metadados ricos:
schemaVersion,taxes,exchangeRateetraceIdem cada entrada. - Métricas como
payment_idempotency_conflicts_totalajudam a detectar problemas antes do financeiro avisar.
🔗 Recursos
- Artigo completo: https://enouveau.io/blog/2025/11/09/payment-service-ledger.html
- Repositório: https://github.com/adelmonsouza/30DiasJava-Day09-Payment
- Projeto pessoal: Este é um projeto do desafio #30DiasJava, mantido independentemente para fins educacionais.
Next episode → Day 10/30 — Reporting Service em Spring Boot