Skip to main content
Peserta membeli tier di dalam batch training. Pembayaran lewat Scalev; setelah lunas, enrollment aktif dan fitur tier terbuka.

Diagram utama

Halaman publik (frontend)

RouteFungsi
/orderKatalog batch & tier (OrderCatalog.tsx)
/register/:batch/:tierForm pendaftaran (Register.tsx)
/payment/checkoutTampilkan QR/VA/link bayar
/payment/statusCek status sesi
/payment/successSukses + claim akun
/payment/failedGagal / expired
/payment/callbackRedirect dari provider

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):
  1. Validasi batch & tier (slug)
  2. Cek duplikat email per batch
  3. Buat / pakai akun Better Auth (provisionAuthAccount)
  4. ensurePendingEnrollmentForPayment — baris enrollment
  5. Buat payment_session + claimToken
  6. Panggil Scalev → QRIS, VA BNI/BRI/…, OVO, GoPay, dll.
  7. Return paymentUrl, sessionId, instruksi bayar
Metode bayar (schema): qris, va, invoice, ovo, dana, shopeepay, linkaja, gopay

3. Pembayaran Scalev

Dua jalur konfirmasi: Webhook: verifikasi secret SCALEV_WEBHOOK_SECRET
Kode: payment.service.tshandleScalevWebhook

4. Aktivasi enrollment

Saat payment_session.status = paid:
  • enrollment.paymentStatuspaid
  • enrollment.statusactive
  • Workspace peserta bisa dipakai
  • getPaidAccess() mengembalikan aiFeatures, courseIds, benefits
Idempotent — webhook retry tidak double-activate.

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:
Field tierFungsi
priceHarga (min validasi Scalev)
courseIdsKursus yang dibuka
aiFeaturesGate AI hub
scalevVariantUniqueIdProduk di Scalev
scalevBundlePriceOptionUniqueIdOpsi harga bundle
Health check Scalev: getBatchScalevHealth, resync tier — admin tier management. Dev lokal tanpa Scalev:
# .env.development.local
PAYMENT_PROVIDER=manual

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

Jika PAYMENT_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

Setelah bayar — apa yang terbuka?

Layanan terkait

File penting

FileIsi
payment.service.tsRegister, webhook, claim, tier CRUD
payment.routes.tsHTTP + rate limit
scalev.service.tsClient Scalev API
enrollment.service.tsPaid access aggregation
resolve-course-access.tsResolve courseIds tier