QA manual untuk tagihan langganan HaloRT yang dibayar lewat QRIS dinamis dari merchant GoPay HaloRT, dengan konfirmasi manual oleh operator. Proses rilis: Testing/Testing Mechanism. Alur gateway lama (Duitku / Doit.id): Testing/Duitku SaaS Billing.
Ini hanya untuk invoice SaaS (hrt…). Iuran warga tidak pernah memakai QRIS ini — tetap Doit.id / Duitku / bukti transfer (Features/Iuran Managed HaloRT).
Cara kerja singkat
- Pengurus / operator klik Bayar → API membuat invoice
pendingdengan kode unik yang ditambahkan ke harga paket. Kode diambil dari slot terkecil yang masih kosong — 1–9 dulu, lalu 10–99, lalu 100–999 — jadi biasanya pembayar hanya lebih bayar beberapa rupiah (contoh Rp 99.000 → Rp 99.001). - API menyusun QRIS dinamis dari QR statis merchant (tag 54 = nominal bayar, CRC baru) dan mengarahkan browser ke
app.halort.com/bayar/{merchantOrderId}?t=…. - Pembayar scan QR dengan e-wallet / m-banking apa pun. Nominal sudah terisi.
- Email
[HaloRT] QRIS Rp … — {tenant}dikirim ke ops. - Operator mencocokkan mutasi GoPay Merchant dengan nominal tepat di admin.halort.com/transactions → Konfirmasi lunas → langganan diperpanjang, email invoice paid terkirim.
Nominal bayar unik di antara invoice QRIS pending yang belum kedaluwarsa, jadi satu nominal = satu invoice.
Persiapan
halort-platform,halort-platform-web,halort-adminsudah deploy darimain(GitHub Actions → Argo CD). Kolom baruplatform_invoices(provider,unique_code,payable_amount,qris_payload,expires_at,confirmed_by_email,confirmation_note) dibuat otomatis saat API start (prisma db pushdi startup) — tidak perludb:pushmanual.- Secret
halort-platform-runtime-envberisiPAYMENT_PROVIDER_SAAS=qris,QRIS_STATIC_PAYLOAD,QRIS_TOKEN_SECRET(lihat Ops/Secrets Overview). Isi dihalort-infra/.envlalumake sync-platform-secrets. QRIS_STATIC_PAYLOAD= string mentah hasil decode QR statis GoPay Merchant (diawali000201, diakhiri6304+ 4 hex). Jika CRC tidak valid, API log peringatan dan QRIS dianggap belum dikonfigurasi — pembuatan invoice SaaS ditolak sampai payload diperbaiki atauPAYMENT_PROVIDER_SAASdihapus.- Akses dashboard / app GoPay Merchant untuk melihat mutasi masuk.
- Tenant uji:
gp2. Catat paket dan jatuh tempo sebelum bayar.
A — Buat invoice
| # | Langkah | Expected |
|---|---|---|
| A1 | Pengurus gp2 → /admin/settings/layanan → pilih Starter, Bulanan → Bayar | Redirect ke app.halort.com/bayar/hrt…?t=… |
| A2 | Operator → Tenant Control → edit gp2 → Bayar | Sama seperti A1 |
| A3 | Cek email ops | Subjek [HaloRT] QRIS Rp 99.xxx — {tenant}, tautan ke halaman transaksi QRIS pending |
| A4 | Buat 2 invoice berturut-turut dengan paket & durasi sama | Nominal bayar berbeda: kode unik 1 lalu 2 (slot terkecil yang kosong) |
| A5 | Tandai kedaluwarsa invoice kode 1, lalu buat invoice baru dengan paket sama | Kode 1 dipakai lagi |
B — Halaman checkout (/bayar/…)
| # | Langkah | Expected |
|---|---|---|
| B1 | Buka tautan di desktop dan HP | Nominal besar, rincian harga paket + kode unik, QR tampil, nama merchant sesuai QR statis |
| B2 | Salin nominal | Nominal tanpa titik tersalin ke clipboard |
| B3 | Scan QR dengan GoPay / m-banking (jangan bayar dulu) | Nominal terisi otomatis = nominal bayar; nama merchant cocok |
| B4 | Ubah / hapus parameter ?t= | “Tagihan tidak ditemukan” (404) |
| B5 | Biarkan halaman terbuka | Status di-poll tiap ~15 detik; Cek status memuat ulang manual |
| B6 | View source / header respons API | Cache-Control: no-store, X-Robots-Tag: noindex |
C — Bayar & konfirmasi (uang sungguhan, nominal kecil)
Gunakan paket termurah; ini transaksi production ke merchant HaloRT.
| # | Langkah | Expected |
|---|---|---|
| C1 | Bayar QR dari B3 | Mutasi masuk di GoPay Merchant dengan nominal tepat |
| C2 | admin.halort.com → Transaksi → chip Menunggu konfirmasi QRIS | Invoice tampil; kolom Nominal bayar menyorot kode unik |
| C3 | Isi Nominal tepat (Rp) dengan nominal mutasi | Hanya invoice itu yang muncul |
| C4 | Konfirmasi lunas → nominal sudah terisi → isi referensi (ID transaksi GoPay) → simpan | Status paid; kolom dikonfirmasi oleh = email operator |
| C5 | Cek tenant gp2 | Jatuh tempo +1 bulan, paket sesuai, status ACTIVE |
| C6 | Halaman /bayar/… pembayar | Berganti ke layar Lunas; QR tidak ditampilkan lagi |
| C7 | Email pengurus | Invoice paid, PDF memuat baris Kode Unik QRIS dan total = nominal bayar |
| C8 | Ulangi POST …/confirm untuk invoice yang sudah paid | Dikembalikan apa adanya; tidak menambah bulan dua kali |
D — Kasus khusus
| Skenario | Expected |
|---|---|
| Pembayar transfer nominal berbeda (mis. tanpa kode unik) | Modal konfirmasi wajib catatan; tetap bisa dikonfirmasi setelah dicocokkan manual |
Invoice lewat QRIS_EXPIRY_HOURS (default 24 jam) | Status expired; halaman bayar menampilkan “Tagihan ditutup”; tidak ada QR |
| Uang masuk setelah expired | Operator tetap bisa Konfirmasi lunas (peringatan kedaluwarsa tampil); catatan audit tersimpan |
| Tandai kedaluwarsa pada invoice pending | Status expired; nominal bayar bebas dipakai invoice baru |
| Invoice Doit.id / Duitku | Tombol Konfirmasi / Tandai kedaluwarsa tidak muncul; API menolak (400) |
Iuran warga (hri…) | Tidak pernah memakai QRIS, walau PAYMENT_PROVIDER_SAAS=qris |
PAYMENT_PROVIDER_SAAS=qris tapi QRIS_STATIC_PAYLOAD / QRIS_TOKEN_SECRET kosong atau CRC rusak | Tombol bayar error “QRIS belum dikonfigurasi” (503); tidak ada invoice QRIS dibuat |
PAYMENT_PROVIDER_SAAS dihapus | Pembayaran SaaS kembali ke Doit.id / Duitku (rollback) |
Cek cepat API:
GET https://api.halort.com/api/payments/qris/{merchantOrderId}?t={token}
POST https://api.halort.com/api/platform/invoices/{merchantOrderId}/confirm { "paid_amount": 99137, "reference": "…", "note": "…" }
POST https://api.halort.com/api/platform/invoices/{merchantOrderId}/expire { "note": "…" }
Endpoint /api/platform/* butuh sesi operator platform.
Laporan issue
Format Testing/Testing Mechanism:
Scenario: QRIS B3 / C4 / D-expired
Device + OS: Chrome macOS / GoPay Android
Tenant: gp2
merchantOrderId: hrt…
Nominal bayar: Rp …
Steps: …
Expected: …
Actual: …
Screenshot: halaman /bayar + mutasi GoPay Merchant (sensor data pribadi)
Terkait
Testing/Duitku SaaS Billing · Guides/Platform/Super Admin Platform · Surfaces/Platform API · Ops/Secrets Overview · Testing/Web Admin Checklist