Rute Bayar dibangun sebagai payment router berbasis Go dengan dua komponen utama:
- CLI untuk onboarding dan operasi manual.
- Daemon untuk webhook receiver dan background reconciliation.
- Modular per provider.
- Domain internal netral provider.
- Inbound dan outbound disimpan sebagai JSON mentah.
- Webhook forwarding bersifat pass-through, tanpa transformasi payload.
- Semua operasi penting dibuat idempotent.
- Provider-specific logic tidak bocor ke layer bisnis inti.
Menangani:
- onboarding provider
- setup credential
- create payment
- check status
- refund jika capability provider tersedia
- replay webhook
- reconcile transaksi
Menangani use case bisnis:
- create payment intent
- record payment attempt
- normalize provider response
- process webhook event
- sync status
- issue refund untuk provider yang mendukung capability refund
- evaluate forwarding rule
- dispatch forward job
Setiap provider punya adapter sendiri.
Contoh:
providers/midtransproviders/xenditproviders/doku
Tanggung jawab adapter:
- request mapping
- response mapping
- webhook verification
- webhook parsing
- supported capabilities
SQLite dipakai untuk:
- payment intents
- payment attempts
- webhook events
- refunds
- provider configuration
- audit logs
Catatan: tabel/domain refunds tersedia untuk provider yang mendukung refund. iPaymu saat ini tidak mengaktifkan refund karena API publik iPaymu v2 belum menyediakan endpoint refund resmi/terverifikasi.
Daemon expose endpoint webhook per provider, misalnya:
/webhooks/midtrans/webhooks/xendit/webhooks/doku
Fungsi daemon:
- verifikasi signature/token
- dedup webhook
- simpan payload mentah
- dispatch ke application layer
- update status transaksi
- forward webhook ke target yang sudah dikonfigurasi user
Forwarding dibuat sebagai kemampuan daemon untuk mengirim ulang webhook inbound ke target pilihan user.
Karakteristik:
- pass-through tanpa transformasi payload
- header dan body diteruskan apa adanya sejauh memungkinkan
- konfigurasi target diset lewat CLI
- retry policy default tersedia dan bisa diubah lewat CLI
- logging tetap menyimpan request/response mentah
- CLI atau internal API memanggil application layer.
- Application layer memilih provider adapter.
- Adapter membuat request outbound ke provider.
- Request outbound disimpan sebagai JSON mentah.
- Response provider disimpan sebagai JSON mentah.
- Status internal dibuat atau diperbarui.
- Provider mengirim webhook ke daemon.
- Daemon memverifikasi signature/token.
- Payload inbound disimpan sebagai JSON mentah.
- Event di-normalisasi ke domain internal.
- Status transaksi diperbarui.
- Jika user mengaktifkan forwarding, payload dikirim ke target tujuan.
- Jika event tidak final, reconciliation job dapat mengecek status provider.
Minimal yang harus ada:
- structured logging
- request/response raw JSON
- audit log
- retry counter
- webhook delivery history
- forward delivery history
Kalau provider baru ditambahkan, perubahan idealnya hanya terjadi di:
- provider adapter baru
- capability registry
- mapping status
- webhook parser
Core domain dan CLI contract tidak perlu berubah besar.