Diagram utama
Halaman publik (frontend)
Tahap backend
1. Katalog publik
GET /api/payment/public/batches — batch aktif + tier + harga (rate limited).
2. Register & buat sesi
POST /api/payment/register (rate limit 10 / 15 menit):
- Validasi batch & tier (slug)
- Cek duplikat email per batch
- Buat / pakai akun Better Auth (
provisionAuthAccount) ensurePendingEnrollmentForPayment— baris enrollment- Buat
payment_session+claimToken - Panggil Scalev → QRIS, VA BNI/BRI/…, OVO, GoPay, dll.
- Return
paymentUrl,sessionId, instruksi bayar
qris, va, invoice, ovo, dana, shopeepay, linkaja, gopay
3. Pembayaran Scalev
Dua jalur konfirmasi: Webhook: verifikasi secretSCALEV_WEBHOOK_SECRETKode:
payment.service.ts → handleScalevWebhook
4. Aktivasi enrollment
Saatpayment_session.status = paid:
enrollment.paymentStatus→paidenrollment.status→active- Workspace peserta bisa dipakai
getPaidAccess()mengembalikanaiFeatures,courseIds,benefits
5. Claim setelah bayar
claimPayment(sessionId, claimToken):
- Validasi claim token (one-time)
- Aktivasi enrollment jika belum
- Issue signInToken Better Auth → auto login di
/payment/success
Tier & Scalev mapping
Admin mengatur tier di batch:
Health check Scalev:
getBatchScalevHealth, resync tier — admin tier management.
Dev lokal tanpa Scalev:
Manual mark paid (admin)
Admin bisa tandai lunas di Daftar Peserta — enrollment paid meski sesi Scalev masih pending; checkout poll menyelaraskan session.Payment provider manual
JikaPAYMENT_PROVIDER=manual, URL bayar mengarah ke instruksi manual (MANUAL_PAYMENT_URL) — untuk dev/staging.
Duplicate registration
Email sudah terdaftar di batch yang sama:- Sudah paid → error duplicate
- Masih pending → resume sesi bayar lama jika masih valid