S SparkMind
DOKUMEN ONBOARDING DUITKU — POIN #10

Alur / Flow Pembayaran
SparkMind × Duitku

Dokumentasi resmi end-to-end payment journey untuk website https://sparkmind-v2.pages.dev/ — atas nama PT Cakrawarti Waskita Digital, terintegrasi penuh dengan Duitku Payment Gateway (Merchant Code D22457, mode production).

Project Code
D22457
Merchant
PT Cakrawarti Waskita Digital
Gateway Mode
PRODUCTION (LIVE)
Last Updated

Daftar Isi

§1 · High-Level Flow Diagram

Ringkasan visual 6 tahap utama. Detail teknis tiap tahap ada di bawah.

1. UserPilih Plan 2. SparkMind/api/payment/create-invoice 3. Duitku APISign + Issue Token 4. Duitku POPVA / QRIS / E-wallet / CC 5. CallbackIP+MD5+Idempotent 6. Sukses/payment/return POST plan SHA256 sig paymentUrl notify redirect

§2 · Detail 6 Tahap Pembayaran

1

User Memilih Plan di Halaman Pricing

User mengakses /pricing dan memilih salah satu paket berlangganan SparkMind.

  • Plan tersedia: Pro Monthly (Rp 49.000), Pro Yearly (Rp 470.000), Team (Rp 745.000), Lifetime (Rp 1.490.000), dan paket Clarity Coach.
  • Daftar harga di-hardcode di server (PRICING_PLANS) untuk mencegah price tampering dari client.
  • User klik tombol "Bayar Sekarang" → memicu request ke API SparkMind.
// Endpoint katalog plan (publik, read-only)
GET https://sparkmind-v2.pages.dev/api/payment/plans
2

SparkMind Server Membuat Invoice

Cloudflare Worker (Hono) menerima request, validasi plan, generate merchantOrderId unik, dan men-sign request dengan SHA256.

  • Endpoint: POST /api/payment/create-invoice
  • Body: { "planId": "pro-monthly", "customerEmail": "...", "customerName": "..." }
  • Server menghitung signature: SHA256(merchantCode + merchantOrderId + amount + apiKey)
  • callbackUrl & returnUrl di-set ke domain canonical https://sparkmind-v2.pages.dev.
// Request ke Duitku
POST https://passport.duitku.com/webapi/api/merchant/v2/inquiry
{
  "merchantCode": "D22457",
  "paymentAmount": 49000,
  "merchantOrderId": "SM-1735000000-AB12CD",
  "productDetails": "SparkMind Pro - 1 bulan langganan",
  "signature": "<sha256 hex>",
  "callbackUrl": "https://sparkmind-v2.pages.dev/api/payment/callback",
  "returnUrl": "https://sparkmind-v2.pages.dev/payment/return"
}
3

Duitku API Mengembalikan Payment Token

Duitku memvalidasi signature, membuat invoice di sistemnya, lalu mengembalikan reference + paymentUrl.

  • SparkMind menerima response dari Duitku (HTTP 200).
  • Server me-relay paymentUrl ke browser user (sebagai JSON).
  • Browser user otomatis open Duitku Pop-up Payment Page (atau redirect penuh sebagai fallback).
4

User Memilih Metode & Membayar di Duitku Pop

Halaman Duitku menampilkan semua metode yang tersedia. User memilih satu dan menyelesaikan pembayaran.

Virtual Account
BCA, BNI, BRI, Mandiri, Permata
QRIS
Semua bank/e-wallet QRIS
E-Wallet
OVO, DANA, ShopeePay, LinkAja
Credit Card
Visa / Mastercard / JCB

Pembayaran ditangani 100% di environment Duitku — SparkMind tidak menyimpan data kartu / OTP / PIN apapun (PCI-DSS scope reduction).

5

Callback Duitku → SparkMind (Server-to-Server)

Setelah pembayaran berhasil, Duitku mengirim notifikasi async ke callbackUrl kami. Endpoint ini di-harden dengan 3 lapis keamanan:

Layer 1 — IP Whitelist

Hanya 9 IP production Duitku (182.23.85.x & 103.177.101.x) yang diizinkan via CF-Connecting-IP.

Layer 2 — MD5 Signature

Verifikasi MD5(merchantCode + amount + merchantOrderId + apiKey) sesuai docs Duitku.

Layer 3 — Idempotent

In-memory cache mencegah double-processing kalau Duitku retry karena timeout.

// Callback yang diterima SparkMind
POST https://sparkmind-v2.pages.dev/api/payment/callback
Content-Type: application/x-www-form-urlencoded

merchantCode=D22457&amount=49000&merchantOrderId=SM-...
&reference=DXXXXXX&resultCode=00&signature=<md5>
6

User Diarahkan ke Halaman Konfirmasi

Setelah Duitku selesai memproses, user di-redirect ke /payment/return dengan parameter resultCode.

  • resultCode=00 → halaman SUKSES (akun di-upgrade ke Pro/Team/Lifetime).
  • resultCode=01 → halaman PENDING / GAGAL dengan tombol coba lagi.
  • Email konfirmasi otomatis dikirim ke user (subject: "Pembayaran SparkMind berhasil").

Polling tambahan ke /api/payment/status/:merchantOrderId dipakai sebagai safety-net jika callback delay.

§3 · Screenshot User Journey

Mockup tiap tahap (bisa diklik untuk akses langsung halaman live).

Step 1
Halaman Pricing
/pricing →
Step 2-3
Invoice Generated
SparkMind ↔ Duitku API
Step 4
Duitku Pop Payment
VA / QRIS / E-wallet / CC
Step 5
Callback Diterima
/api/payment/callback
Step 6 (Sukses)
Konfirmasi SUKSES
/payment/return →
Step 6 (Gagal)
Konfirmasi GAGAL
/payment/return →

§4 · Keamanan & Tech Stack

Keamanan & Compliance

  • HTTPS-only (TLS 1.3) di seluruh endpoint via Cloudflare.
  • Tidak ada data kartu kredit / PIN / OTP yang disimpan di server SparkMind (PCI-DSS scope reduction — Duitku adalah PCI-DSS Level 1 Service Provider).
  • Server-side pricing catalog (tidak bisa di-tamper dari browser).
  • Callback hardening: IP whitelist + MD5 signature + idempotent processing.
  • API key disimpan sebagai Cloudflare Secret (wrangler pages secret put) — tidak ada di repo.
  • Domain canonical lock untuk callback / return URL — mencegah hijack via preview deployment.

Tech Stack

  • Frontend: HTML5 + Tailwind CSS (CDN) + Vanilla JS
  • Backend: Hono framework di Cloudflare Workers (edge, global)
  • Hosting: Cloudflare Pages — https://sparkmind-v2.pages.dev
  • Payment Gateway: Duitku (Bank Indonesia licensed) — Merchant D22457
  • Auth Signing: Web Crypto API (SHA256) untuk request, MD5 untuk callback verify
  • Storage: Cloudflare KV (planned, untuk subscription state durable)

§5 · Endpoint Reference

Method Path Tujuan Auth
GET/pricingHalaman pilihan planPublic
GET/api/payment/plansKatalog plan (JSON)Public
POST/api/payment/create-invoiceMembuat invoice + sign request ke DuitkuPublic (rate-limited)
POST/api/payment/callbackNotifikasi async dari DuitkuIP+MD5+Idempotent
GET/api/payment/status/:idPolling status order (safety-net)Public
GET/payment/returnHalaman konfirmasi pasca-bayarPublic

§6 · Informasi Merchant

Nama: PT Cakrawarti Waskita Digital
Project Code: D22457
Website: https://sparkmind-v2.pages.dev/
Payment Gateway: Duitku (Bank Indonesia licensed)
Mode: PRODUCTION (LIVE)
Dokumen ini: /flow (alias: /payment-flow)

Dokumen ini disusun untuk memenuhi persyaratan onboarding Duitku poin #10 — "Alur/flow pembayaran pada website yang didaftarkan". Halaman ini bersifat publik & dapat dicetak ( Print / PDF di kanan atas) untuk dilampirkan sebagai PDF dalam balasan email kepada Tim Onboarding Duitku.

Next Step

Balas Email Tim Onboarding Duitku

Setelah PDF dokumen ini di-save, lanjut ke halaman Email Draft — sudah disiapkan template balasan profesional untuk Tim Onboarding Duitku, lengkap dengan checklist 10 dokumen legalitas (KTP, NIB, NPWP, Akta, Foto Lokasi, Rekening, Flow Pembayaran, dst.) yang tinggal di-copy & isi placeholder.