Lewati ke isi

Sentra Membership — Wallet & Billing Module

Overview

Modul Wallet mengelola dompet digital internal (closed-loop) member yang digunakan untuk pembayaran sesi kelas, top-up via QRIS/Midtrans, dan refund. Setiap mutasi saldo menggunakan append-only ledger dengan tanda tangan kriptografis untuk mencegah fraud manipulasi saldo.

12.1 Double-Entry In-App Wallet Engine

Setiap pemotongan saldo wallet dicatat secara seimbang di database akuntansi jurnal kredit-debet untuk audit kepatuhan anti-fraud.

    Transaksi: Top-up Saldo Member Rp 100.000 via QRIS Midtrans

    [ Jurnal Akuntansi Entri Ganda ]
    ├─ Akun Saldo Kas E-Wallet (Asset) ─── DEBET   Rp 100.000 (Bisnis Bertambah)
    └─ Akun Deposit Member (Liability) ── KREDIT  Rp 100.000 (Utang Ke Member)

Sistem menghitung kecocokan kolom saldo di tabel wallets dengan jumlah kumulatif mutasi di tabel wallet_transactions. Jika terjadi selisih perbandingan hash penutupan harian, wallet member dibekukan otomatis oleh sistem untuk investigasi fraud.

Wallet Tamper-Evidence (Anti-Fraud)

Setiap baris di tabel wallets memiliki kolom wallet_signature_hash yang dihitung ulang setiap kali terjadi mutasi saldo:

Signature = HMAC-SHA256(wallet_id || balance || updated_at, Secret_Key)

Sebelum transaksi baru dieksekusi, sistem melakukan hitung ulang signature dan membandingkannya dengan database. Jika tidak cocok (saldo diubah paksa tanpa melalui API resmi), sistem langsung membekukan wallet dan memicu peringatan darurat keamanan internal.

Supported Transaction Types

Type Deskripsi
TOPUP Top-up saldo via QRIS / Midtrans settlement
DEBIT_BOOKING Pemotongan saldo saat booking kelas / sesi
REFUND Pengembalian saldo dari pembatalan kelas
BONUS Kredit bonus dari loyalty program atau kompensasi

Payment Gateway Integration

  • Provider: Midtrans / Xendit
  • Method: Webhook POST /api/v1/wallet/topup menerima payload settlement
  • Security: Validasi signature_key Midtrans sebelum kredit saldo
  • Idempotency: order_id digunakan sebagai kunci idempotensi — webhook duplikat tidak mengkreditkan saldo 2x