host-rutebayar adalah layanan marketplace/payment-orchestrator yang memisahkan peran platform host UMKM dari layer gateway murni yang ada di rute-bayar.
Repo ini ditujukan untuk membuat model seperti ini:
- Host mendaftar dan membuat produk yang dijual.
- Host menentukan produk yang aktif.
- Host menentukan kebijakan fee untuk transaksi (persen/fixed) per produk; termasuk boleh
0(gratis). - Host mengatur environment
sandboxdanproduction. - Saat ada pembayaran, host-bayar/website membuat transaksi melalui host-rutebayar.
- host-rutebayar menyimpan mapping pesanan dan membangun request ke gateway.
- Data pembeli (buyer) hanya digunakan untuk kebutuhan alur pembayaran dan pencatatan internal order.
- Webhook dari gateway diverifikasi, lalu direkonsiliasi ke status order internal.
- Pengiriman callback ke website host dari service ini belum disertakan pada fase ini; alur fanout host ditangani pada fase lanjutan.
- Fee bisa diatur per-host sebagai default policy.
- Host juga bisa override fee per-produk.
- Tipe fee:
percent(contoh:2.5%)fixed(contoh:Rp 1.000)free(0, tidak dipungut fee)
- Fee diproses dari nominal pembayaran sesuai rounding policy yang didokumentasikan (mis. 0 desimal untuk IDR).
- Policy bisa pakai
min_fee,max_fee, dancurrency; dan boleh dipakai sebagaifreeuntuk produk tertentu. - Fee bukan domain
rute-bayar; host-rutebayar sebagai orchestrator menentukan net amount yang diteruskan ke host website/merchant.
- Saat payment dibuat, host-rutebayar mengambil snapshot
FeePolicySnapshot(mis.policy_snapshot_id,policy_version,policy_payload_hash). - Snapshot disimpan di
PaymentOrderagar policy fee tidak berubah saat transaksi berlangsung. - Hasil kalkulasi (gross/host fee/provider fee/net) tetap immutable di
PaymentOrderuntuk kebutuhan audit. - Data settlement diekspor sebagai ledger line:
gross_amountprovider_fee_amounthost_fee_amountnet_amount
Kontrak API operasional service ini berada di:
internal/api/openapi.yaml
Integrasi dengan rute-bayar saat ini:
HOST_RUTEBAYAR_UPSTREAM_BASE_URLdapat dipakai untuk routehost-scopedke daemon rute-bayar.POST /host/{host_id}/paymentsdanGET /host/{host_id}/payments/{reference}diproksi ke endpoint upstreamrute-bayarbila dikonfigurasi.- Rekonsiliasi webhook dilakukan di
host-rutebayaruntuk menjaga state order dan ledger.
- Repository ini fokus pada orchestrasi host+produk+policy, lifecycle pembayaran, dan operasional self-hosted.
- Bukan implementasi gateway baru—gateway tetap di handle di layer
rute-bayar(existing). - Fokus saat ini: registrasi tenant/product/provider, pembuatan payment, webhook reconcile, dan dashboard observability.
- Host bisa punya banyak produk + aturan sendiri.
- Onboarding gateway per-host dapat dikelola secara independen.
- Integrasi website host lebih konsisten karena bisa memakai endpoint host-rutebayar yang terstandar.
- Audit + routing webhook lebih terpusat.
- Host/website mendaftarkan host profile + product catalog.
- Host memanggil API host-rutebayar untuk membuat invoice/payment request.
- host-rutebayar membuat intent internal + memilih provider sesuai policy host/product.
- host-rutebayar memanggil provider (via wrapper adapter) untuk mendapatkan URL/payment reference.
- Webhook provider masuk ke host-rutebayar, diverifikasi, lalu dibaca dari mapping.
- host-rutebayar menyimpan status final + ledger untuk observability operasional.
- host-rutebayar memproses fee sesuai policy host/product, lalu event final tersimpan bersama detail komisi dan gross/net amount.
sandbox: dipakai untuk testing host + integration.production: environment sesungguhnya, terpisah key/credential dan base URL.
Dashboard operasi di /ui akan mengarahkan ke /ui/login jika belum autentikasi.
Default password login fallback admin123 untuk local development, tetapi untuk non-local/prod harus diganti lewat:
HOST_RUTEBAYAR_ADMIN_PASSWORD
Catatan keamanan: jangan pernah hardcode password ini ke source/docs publik.
HOST_RUTEBAYAR_ENV(defaultdevelopment)HOST_RUTEBAYAR_HOST(default127.0.0.1)HOST_RUTEBAYAR_PORT(default18123)HOST_RUTEBAYAR_TIMEOUT(default10s)HOST_RUTEBAYAR_DATABASE_DSN(defaultfile:host-rutebayar.db?_pragma=foreign_keys(ON))HOST_RUTEBAYAR_UPSTREAM_BASE_URL(opsional) — saat diisi, path/host/{id}/payments...akan diproksi ke upstream rute-bayar (/api/v1/...).HOST_RUTEBAYAR_ADMIN_PASSWORD— password login untuk dashboard (opsional di local dev, wajib di non-local/prod).
host_secretdanwebhook_secretwajib unik per-host.- Semua webhook diverifikasi signature/idempotency terlebih dahulu.
- Rekonsiliasi webhook menghasilkan status/order/ledger yang terukur.
- Idempotency pada webhook untuk mencegah double-processing.
- Audit log untuk create/payment/webhook events.
- Fee policy dipertahankan konsisten selama transaksi untuk mencegah drift perhitungan.
host-rutebayar:- menyediakan endpoint API untuk registrasi host, produk, policy, dan pembayaran.
- menyediakan dashboard self-hosted
/uiuntuk monitoring operasional.
rute-bayartetap memegang adapter provider (Xendit/Midtrans/Doku/IPaymu).- Callback host outbound dan pengiriman ke URL host belum aktif pada fase ini.
Berikut adalah struktur utama dari codebase project ini:
cmd/host-rutebayar/: Entry point utama aplikasi.api/openapi.yaml: Kontrak spesifikasi API OpenAPI.docs/: Dokumentasi teknis, runbook operasional, dan kriteria penerimaan.internal/: Logika internal aplikasi (tidak dapat di-import oleh package luar).api/: REST API Controllers/Handlers (registrasi host, produk, provider, dll.).config/: Parser dan validator konfigurasi runtime.domain/: Model data/entitas inti (Host,Product,PaymentOrder, dll.).gateway/: Abstraksi provider gateway.http/: Router HTTP, middleware, UI dashboard admin, dan static assets.observability/: Logging, metrik audit trail, dan alert thresholds.orchestration/: Kalkulasi fee, intent matching, settlement, dan ledger.proxy/: Proxy layer untuk mem-forward request host-scoped ke upstreamrute-bayar.security/: Verifikasi signature webhook, kriptografi kunci, dan otentikasi dashboard.storage/: Database access layer SQLite dan migrasi schema.
- Go 1.23+
- SQLite3 (driver database tertanam otomatis)
Semua kontribusi kode wajib lolos pengujian unit test. Jalankan test suite dengan perintah berikut:
go test -v ./...- Build binary aplikasi:
go build -o host-rutebayar ./cmd/host-rutebayar
- Jalankan binary dengan konfigurasi default:
./host-rutebayar
- Akses dashboard di browser pada
http://127.0.0.1:18123/ui(password login default:admin123).
Untuk petunjuk operasional dan skrip seeding lengkap, silakan merujuk ke Self-hosted Runbook.
- Detail peta jalan proyek dapat dilihat di PLAN.md.
- Status saat ini: Fase 6-8 telah selesai diimplementasikan (registrasi host/product/provider, payment flow, webhook reconcile, dashboard, dan runbook).
- Operasional lanjutan difokuskan ke hardening dan callback fanout host outbound.
- Kontribusi baru sangat kami hargai. Silakan baca CONTRIBUTING.md sebelum mengirimkan Pull Request.
- Project ini dilisensikan di bawah MIT License.