“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_ledger guarda cada transição (AUTHORIZED, CAPTURED, REFUNDED). Nada de UPDATE — 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, publicamos PaymentReceivedEvent para alimentar XP, relatórios e notificações.
  • Reconciliação diária: job reconcile-payments compara ledger × provedor e registra divergências em payment_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, exchangeRate e traceId em cada entrada.
  • Métricas como payment_idempotency_conflicts_total ajudam a detectar problemas antes do financeiro avisar.

🔗 Recursos


Next episodeDay 10/30 — Reporting Service em Spring Boot