StellarPayCheckout

Dokumentasi

Cara kerja Stellar Pay, dijelaskan lengkap

Baik kamu pembeli yang baru menerima link pembayaran, maupun pemilik toko yang mengelola Stellar Pay — semua alurnya ada di sini.

Ringkasan

Stellar Pay adalah sistem checkout QRIS yang dipasang di atas akun GoPay Merchant milik toko sendiri. Ketika ada transaksi, sistem membuat kode QRIS dengan nominal yang sudah tertanam, lalu memantau mutasi masuk ke akun tersebut untuk mengonfirmasi pembayaran — tanpa perlu ada yang mengecek manual.

Tidak ada database di balik layar. Setiap link pembayaran menyimpan informasinya sendiri (nominal, catatan, waktu dibuat) di dalam ID-nya, dan status lunas/belum selalu diperiksa langsung ke akun GoPay Merchant saat halaman dibuka.

Cara pembeli membayar

Kalau kamu menerima link berbentuk domain.com/pay/<id>, berikut yang akan kamu lihat:

  1. 1

    Buka link pembayaran

    Halaman menampilkan total tagihan dan kode QRIS. Nominalnya sudah tertanam di dalam kode — kamu tidak perlu mengetik ulang apa pun.

  2. 2

    Scan dari e-wallet apa pun

    QRIS ini adalah QRIS standar Indonesia, jadi bisa dipindai dari GoPay, OVO, DANA, ShopeePay, m-banking, atau e-wallet lain yang mendukung QRIS.

  3. 3

    Selesaikan pembayaran seperti biasa

    Konfirmasi pembayaran di aplikasi e-wallet kamu sendiri — Stellar Pay tidak pernah meminta login, OTP, atau data pembayaran apa pun darimu.

  4. 4

    Halaman berubah otomatis

    Beberapa detik setelah dana diterima toko, halaman berubah menjadi "Pembayaran diterima" dengan sendirinya — tidak ada tombol "saya sudah bayar" yang perlu ditekan.

Melacak status pembayaran

Setiap link pembayaran punya halaman resi kembar di domain.com/transaction/<id> — berguna untuk dibuka lagi nanti tanpa perlu scan ulang QR. Halaman ini menampilkan nominal, catatan (kalau ada), waktu dibuat, dan status terkini, lengkap dengan tombol "Segarkan" untuk mengecek ulang kapan saja.

Selama status masih "Menunggu pembayaran", halaman ini memeriksa ulang secara berkala dengan sendirinya. Begitu lunas, waktu pembayaran dan ID transaksinya ikut ditampilkan sebagai bukti.

Untuk pemilik toko

Kalau kamu mengelola toko ini, ada dua hal yang perlu disiapkan sekali di awal, lalu satu kebiasaan yang dipakai berulang.

1. Sambungkan akun GoPay Merchant

Dilakukan sekali di halaman admin — masuk dengan nomor HP (OTP) atau email dan kata sandi akun GoPay Merchant. Setelah tersambung, Stellar Pay bisa membaca riwayat mutasi akun tersebut untuk mengecek pembayaran masuk.

2. Buat link pembayaran

Dari dashboard admin, isi nominal (dan catatan opsional, misalnya nomor invoice), lalu link /pay/<id> dan /transaction/<id> langsung tersedia untuk disalin dan dikirim ke pembeli lewat kanal apa pun — WhatsApp, email, atau lainnya.

3. Pantau dari dashboard

Dashboard admin menampilkan daftar transaksi masuk terbaru langsung dari akun GoPay Merchant kamu, jadi tidak perlu bolak-balik buka aplikasi GoBiz terpisah untuk rekap harian.

Alternatifnya, form checkout manual di halaman checkout bisa dipakai langsung tanpa membuat link terlebih dulu — cocok untuk transaksi tatap muka di kasir.

Bagaimana verifikasi otomatis bekerja

Kode QRIS yang muncul di setiap transaksi adalah versi dinamis dari QRIS statis milik toko — nominalnya disisipkan langsung ke dalam kodenya sendiri, murni lewat perhitungan, tanpa memanggil layanan luar mana pun untuk membuatnya.

Untuk mengecek apakah sudah dibayar, Stellar Pay membaca riwayat mutasi akun GoPay Merchant milik toko dan mencocokkannya dengan nominal serta waktu transaksi tersebut dibuat. Begitu ditemukan mutasi yang cocok, statusnya berubah menjadi lunas — semua ini terjadi dalam hitungan detik, dicek ulang secara berkala selama halaman terbuka.

Referensi API

Semua endpoint ini adalah API milik Stellar Pay sendiri (bukan API GoBiz) — dipakai oleh halaman checkout, halaman pembayaran, dan dashboard admin. Berguna kalau kamu mau mengintegrasikan Stellar Pay ke sistem lain, mis. membuatkan link pembayaran langsung dari aplikasi kasir.

Method & pathAutentikasiFungsi
POST /api/checkout/generateTidak perluBuat QRIS + link pembayaran baru
GET /api/pay/:id/statusTidak perluCek status sebuah invoice
POST /api/admin/loginTidak perluLogin admin, dapat cookie sesi
POST /api/admin/invoice/createCookie adminBuat link invoice dari dashboard
GET /api/dashboard/transactionsCookie adminRiwayat transaksi terbaru
GET /api/gobiz/session-statusCookie adminCek status koneksi akun GoPay

Endpoint yang butuh cookie admin memakai sesi cookie HTTP-only bernama sp_admin yang didapat dari /api/admin/login — bukan API key/Bearer token. Kalau memanggilnya dari luar browser (mis. lewat curl), simpan cookie itu di sebuah cookie-jar lalu pakai ulang di request berikutnya, seperti contoh di bawah.

Buat checkout — POST /api/checkout/generate

Membuat QRIS dinamis untuk sebuah nominal, sekaligus link /pay/<id> dan /transaction/<id>-nya. Tidak perlu login — dipakai juga oleh halaman checkout publik.

Request

curl
1$ curl -X POST https://domain-kamu.com/api/checkout/generate \
2 -H "Content-Type: application/json" \
3 -d '{"amount": 25000, "fee": false}'

Body

  • amount (number, wajib) — nominal dasar, minimal 1.000, maksimal 10.000.000.
  • fee (boolean, opsional) — kalau true, tambahkan fee acak 0–100 rupiah sebagai pembeda nominal.

Response 200

200 OK
1{
2 "ok": true,
3 "id": "eyJhbW91bnQiOjI1MDAwLCJm...xyz",
4 "amount": 25000,
5 "fee": 0,
6 "totalAmount": 25000,
7 "feeEnabled": false,
8 "image": "data:image/png;base64,iVBORw0KG...",
9 "qris": "00020101021226610014ID.CO.QRIS...6304A1B2",
10 "createdAtMs": 1732300000000,
11 "payUrl": "/pay/eyJhbW91bnQiOjI1MDAwLCJm...xyz",
12 "transactionUrl": "/transaction/eyJhbW91bnQiOjI1MDAwLCJm...xyz"
13}

Cek status invoice — GET /api/pay/:id/status

Membaca ulang status pembayaran sebuah invoice langsung dari akun GoPay Merchant — dipanggil berkala oleh halaman /pay dan /transaction. Tidak perlu login.

Request

curl
1$ curl https://domain-kamu.com/api/pay/eyJhbW91bnQiOjI1MDAwLCJm...xyz/status

Response 200 (belum dibayar)

200 OK
1{
2 "ok": true,
3 "paid": false,
4 "amount": 25000,
5 "note": null,
6 "createdAtMs": 1732300000000,
7 "tx": null
8}

Response 200 (sudah dibayar)

200 OK
1{
2 "ok": true,
3 "paid": true,
4 "amount": 25000,
5 "note": null,
6 "createdAtMs": 1732300000000,
7 "tx": {
8 "amount": 25000,
9 "txId": "GP-20241122-000123",
10 "time": "22 Nov 2024, 14:05"
11 }
12}

Login admin — POST /api/admin/login

Menukar password admin (ADMIN_SECRET) dengan cookie sesi sp_admin yang berlaku 12 jam. Cookie ini yang dipakai semua endpoint admin di bawahnya.

Request

curl
1$ curl -X POST https://domain-kamu.com/api/admin/login \
2 -H "Content-Type: application/json" \
3 -d '{"password": "password-admin-kamu"}' \
4 -c cookies.txt

Response 200

200 OK
1{ "ok": true }

Flag -c cookies.txt menyimpan cookie yang dikirim server ke sebuah file — pakai -b cookies.txt di request-request admin berikutnya supaya tetap dianggap login.

Buat link invoice — POST /api/admin/invoice/create

Endpoint yang dipakai form "Buat link pembayaran" di dashboard. Butuh cookie admin yang valid.

Request

curl
1$ curl -X POST https://domain-kamu.com/api/admin/invoice/create \
2 -H "Content-Type: application/json" \
3 -b cookies.txt \
4 -d '{"amount": 150000, "note": "Invoice #123"}'

Body

  • amount (number, wajib) — nominal, 1.000–10.000.000.
  • note (string, opsional) — catatan bebas, mis. nomor invoice.

Response 200

200 OK
1{
2 "ok": true,
3 "id": "eyJhbW91bnQiOjE1MDAwMCwi...abc",
4 "payUrl": "/pay/eyJhbW91bnQiOjE1MDAwMCwi...abc",
5 "transactionUrl": "/transaction/eyJhbW91bnQiOjE1MDAwMCwi...abc"
6}

Riwayat transaksi — GET /api/dashboard/transactions

Mengambil mutasi masuk terbaru dari akun GoPay Merchant yang tersambung. Dipakai dashboard admin untuk daftar transaksi.

Query params

  • days (opsional, default 1) — rentang hari ke belakang.
  • size (opsional, default 30) — jumlah maksimal baris.

Request

curl
1$ curl "https://domain-kamu.com/api/dashboard/transactions?days=7&size=50" \
2 -b cookies.txt

Response 200

200 OK
1{
2 "ok": true,
3 "histories": [
4 {
5 "txId": "GP-20241122-000123",
6 "time": "22 Nov 2024, 14:05",
7 "amount": { "value": 25000, "currency": "IDR" }
8 }
9 ]
10}

Kalau sesi GoPay sudah kedaluwarsa, endpoint ini membalas 401 dengan unauthorized: true — tandanya perlu connect ulang akun GoPay dari dashboard.

Status koneksi GoPay — GET /api/gobiz/session-status

Mengecek apakah akun GoPay Merchant masih tersambung dan sesinya masih berlaku.

Request

curl
1$ curl https://domain-kamu.com/api/gobiz/session-status \
2 -b cookies.txt

Response 200

200 OK
1{
2 "connected": true,
3 "merchantId": "1234567",
4 "merchantName": "Toko Kamu"
5}

Contoh pemakaian dari JavaScript — membuat link pembayaran dari sistem kasir sendiri, lalu mengarahkan pembeli ke sana:

buat-link-pembayaran.ts
1const res = await fetch("https://domain-kamu.com/api/checkout/generate", {
2 method: "POST",
3 headers: { "Content-Type": "application/json" },
4 body: JSON.stringify({ amount: 25000 }),
5});
6 
7const data = await res.json();
8if (!data.ok) throw new Error(data.message);
9 
10// arahkan pembeli ke data.payUrl, atau tampilkan data.qris/data.image
11console.log(data.payUrl);

Keamanan & privasi

  • Nominal tidak bisa diubah manual

    Setiap link pembayaran ditandatangani secara digital di sisi server. Kalau ada yang mencoba mengubah nominal lewat URL, tanda tangannya tidak akan cocok dan link dianggap tidak valid.

  • Tidak ada data pembeli yang disimpan

    Stellar Pay tidak pernah meminta atau menyimpan nama, nomor HP, maupun data pembayaran pembeli.

  • Dana tidak transit di pihak ketiga

    Karena QRIS yang dipindai adalah milik toko itu sendiri, dana langsung masuk ke akun GoPay Merchant penjual — bukan ke rekening perantara.

  • Akses admin dibatasi kata sandi

    Dashboard dan pembuatan link pembayaran hanya bisa diakses lewat login admin yang terpisah dari akun GoPay itu sendiri.

Pertanyaan umum

Apakah link pembayaran punya batas waktu?+

Tidak seperti QRIS di form checkout manual (yang berlaku 10 menit), link /pay/<id> yang dibuatkan admin tidak kedaluwarsa secara otomatis. Selama transaksinya masih terlacak di riwayat GoPay Merchant (maksimal 30 hari ke belakang), halaman status tetap bisa membaca hasilnya.

Kenapa total tagihan kadang beda beberapa rupiah dari harga yang disebutkan?+

Beberapa link pembayaran mengaktifkan fee acak kecil (0–100 rupiah). Ini murni angka pembeda, bukan biaya tambahan untuk pembeli — gunanya membantu sistem membedakan dua transaksi dengan nominal dasar yang kebetulan sama pada waktu yang berdekatan.

Bagaimana kalau saya sudah bayar tapi status belum berubah?+

Beri jeda beberapa detik lalu tekan "Segarkan" di halaman status. Sistem memang menunggu jeda singkat sebelum mutasi tercermin, dan pemeriksaan otomatis akan terus mengulang setiap beberapa detik selama status masih "Menunggu pembayaran". Kalau setelah beberapa menit masih belum berubah, hubungi penjualnya langsung.

Apakah data kartu atau rekening saya tersimpan di Stellar Pay?+

Tidak ada data pembeli yang disimpan sama sekali. Stellar Pay tidak meminta nama, nomor HP, maupun metode pembayaran pembeli — pembayaran terjadi sepenuhnya di aplikasi e-wallet pembeli sendiri.

Apakah Stellar Pay menahan dana sebelum diteruskan ke penjual?+

Tidak. QRIS yang dipindai adalah kode QRIS milik toko itu sendiri (dibuat dinamis untuk tiap transaksi), sehingga dana masuk langsung ke saldo GoPay Merchant milik penjual. Stellar Pay hanya memantau mutasi itu untuk mengonfirmasi status — tidak pernah ada dana yang transit lewat pihak ketiga.

Batasan & disclaimer

Stellar Pay bukan produk resmi Gojek/GoTo. Sistem ini memakai akun GoPay Merchant milik pemilik toko sendiri untuk membaca riwayat mutasi, sehingga bergantung pada ketersediaan dan perilaku layanan tersebut — kalau ada perubahan di sisi mereka, deteksi otomatis bisa untuk sementara terganggu sampai diperbaiki. Gunakan sesuai kebijaksanaan dan tanggung jawab pemilik akun.

Masih ada pertanyaan lain? Hubungi penjual atau pengelola toko tempat kamu menerima link pembayaran ini.