Hubungkan bot, website, atau sistem penjualan Anda langsung ke saldo Gempay. Panduan ini mencakup
seluruh alur dari sandbox hingga produksi, API Cek Region MLBB, strategi aman saat timeout, dan verifikasi callback.
Ikuti panduan ini dari pembuatan key hingga go-live. Semua contoh memakai JSON, harga dalam
integer rupiah, dan kontrak respons yang sama untuk sandbox maupun produksi. Key yang sama juga
dapat digunakan untuk API Cek Region MLBB.
Base URL
https://gempaytopup.com/api/v1
Contoh username key
gmp_1234abcd
1. Alur integrasi yang disarankan
01Buat key sandboxSimpan username dan secret yang hanya ditampilkan sekali.
02Uji autentikasiPanggil endpoint balance dengan signature yang benar.
03Ambil price-listSimpan SKU, harga role, status produk, dan definisi field tujuan.
04Uji tiga statusGunakan ref_id sandbox untuk hasil sukses, gagal, dan pending.
05Pasang callbackVerifikasi HMAC dari raw body dan tetap sediakan polling status.
06Buat key produksiIsi saldo, batasi IP server, lalu lakukan transaksi nominal kecil.
Aturan paling penting: jika request transaksi timeout, atau menerima
rc 03/rc 99, gunakan endpoint status dengan
ref_id yang sama. Jangan membuat ref_id baru karena transaksi pertama mungkin sudah diproses.
2. Koneksi, kredensial, dan autentikasi
Aturan transport
• Method seluruh endpoint: POST.
• Header: Content-Type: application/json.
• Gunakan HTTPS dan kirim dari backend/server, bukan JavaScript browser.
• Harga dan saldo selalu integer rupiah, tanpa desimal.
• Kondisi bisnis umumnya memakai HTTP 200; keputusan diambil dari data.rc.
Field autentikasi wajib
username
Prefix key, misalnya gmp_1234abcd.
ref_id
Referensi dari sistem Anda, 1–64 karakter, tanpa spasi di awal/akhir.
sign
MD5 huruf kecil dari gabungan username, secret, dan ref_id tanpa pemisah.
sign = md5(username + secret + ref_id)
// Tidak memakai titik dua, pipe, spasi, atau newline di antara nilai.
// Contoh sumber hash:
gmp_1234abcdSECRET_ANDAorder-20260802-0001
Signature request memakai MD5 untuk kompatibilitas klien reseller. Signature callback berbeda:
callback memakai HMAC-SHA256 atas raw body. Jangan tertukar.
3. Contoh kode klien
Simpan kredensial di environment variable server. Fungsi berikut dapat dipakai untuk semua endpoint;
payload khusus endpoint ditambahkan pada argumen terakhir.
Mengembalikan seluruh katalog. price sudah memakai role harga pemilik key.
Jangan memakai harga yang disimpan permanen; sinkronkan ulang secara berkala dan sebelum menampilkan harga jual hilir.
Jika transaksi tidak ditemukan untuk key tersebut, API mengembalikan rc 01 dan pesan
Transaksi tidak ditemukan. Periksa key dan ref_id sebelum membuat order baru.
POST
/api/v1/ml-region
Memakai autentikasi H2H yang sama. Key sandbox dapat menguji respons deterministik tanpa paket;
key produksi membutuhkan paket Region API aktif dan IP yang lolos allowlist key serta whitelist paket.
Jangan menebak atau menggabungkan ID sendiri. Untuk setiap SKU, baca input_fields
dari price-list lalu kirim object tujuan dengan key yang sama. Server yang akan
memvalidasi dan menyusun nomor tujuan supplier.
Aturan ini juga berlaku untuk produk Foxygamestore. Produk Foxy memakai SKU publik berawalan
FX-, tetapi bentuk tujuan tetap selalu mengikuti input_fields
yang dikembalikan price-list.
Field bertipe select mempunyai daftar nilai sah pada properti options.
Field numeric tetap dikirim sebagai string agar nol di depan tidak hilang. Jangan mengubah digit tujuan.
6. Membaca respons dan response code
Semua payload API dibungkus oleh object data. Simpan minimal
ref_id, rc, status, price, sn, dan
respons mentah yang sudah Anda redaksi untuk kebutuhan rekonsiliasi.
rc
Arti
Tindakan sistem Anda
00
Transaksi sukses
Tandai sukses; simpan SN bila tersedia.
01
Transaksi gagal / status tidak ditemukan
Final jika berasal dari transaksi. Order baru hanya atas keputusan pengguna.
02
Ditolak supplier
Final; boleh order ulang dengan ref_id baru setelah penyebab diperbaiki.
03
Pending
Polling status dengan ref_id sama. Jangan order ulang.
40
Parameter tidak lengkap/format ref_id salah
Perbaiki payload atau ref_id, lalu kirim kembali.
41
Autentikasi gagal
Periksa username, secret, ref_id sumber sign, status key, dan status akun.
42
IP tidak diizinkan
Tambahkan IP publik server yang benar atau gunakan key yang sesuai.
43
Rate limit terlampaui
Tunggu pergantian menit, gunakan antrean dan backoff.
51
Saldo tidak cukup
Isi saldo; respons dapat menyertakan balance dan required.
52
SKU tidak ditemukan
Sinkronkan price-list dan periksa buyer_sku_code.
53
Produk tidak tersedia/cut-off
Nonaktifkan sementara di sistem Anda dan sinkronkan ulang.
54
Tujuan tidak valid
Validasi sesuai input_fields; jangan mengubah digit secara otomatis.
55
Transaksi berulang tidak didukung
Jangan ulangi ke tujuan yang sama pada hari tersebut.
56
Nominal di luar batas
Perbaiki nominal berdasarkan aturan produk.
57
Paket API Cek Region tidak aktif
Aktifkan atau perpanjang paket pada key produksi.
58
Kuota API Cek Region habis
Beli periode bulanan baru atau tunggu periode berikutnya.
99
Hasil belum pasti karena kesalahan internal
Polling status dengan ref_id sama. Jangan order ulang.
Nilai status publik adalah Sukses, Pending, atau
Gagal. Gunakan rc sebagai keputusan utama karena pesannya dapat berubah untuk memberi konteks supplier.
7. Timeout, retry, dan idempotensi
Aman dilakukan
• Retry request yang timeout dengan key dan ref_id yang sama.
• Panggil /status memakai ref_id transaksi asli.
• Simpan ref_id unik di database Anda sebelum mengirim request.
• Gunakan satu ref_id untuk satu niat pembelian.
Jangan dilakukan
• Membuat ref_id baru hanya karena koneksi timeout.
• Menganggap HTTP 200 selalu berarti transaksi sukses.
• Mengirim SKU/tujuan berbeda dengan ref_id yang sudah tercatat.
• Menjalankan retry tanpa batas atau tanpa jeda.
Idempotensi berlaku per key: request transaction dengan ref_id yang sama akan mengembalikan transaksi pertama
dan tidak membuat order atau debit kedua. Untuk status pending, polling awal setiap 5 detik lalu perlambat menjadi
10–30 detik. Callback mempercepat pembaruan, tetapi endpoint status tetap menjadi sumber pemulihan.
8. Menguji dengan key sandbox
Sandbox tidak mendebit saldo, tidak membuat order penjualan, dan tidak menghubungi supplier. Produk, harga role,
validasi tujuan, response envelope, idempotensi, dan callback tetap mengikuti bentuk produksi.
Akhiran ref_id
Hasil sandbox
Contoh
Digit ganjil
rc 00 / Sukses
uji-order-1
Digit 0
rc 03 / Pending
uji-order-0
Digit genap selain 0 atau karakter non-digit
rc 01 / Gagal
uji-order-2, uji-order-x
Mode melekat pada key dan tidak dapat diubah. Setelah semua cabang lolos, buat key produksi baru dan ulangi smoke test dengan nominal kecil.
9. Menerima dan memverifikasi callback
Jika callback HTTPS diatur pada key, server mengirim POST application/json ketika hasil tersedia.
Callback tidak memakai envelope data. Balas status HTTP 2xx secepat mungkin setelah signature valid dan payload tersimpan.
Hitung HMAC dari raw body persis seperti diterima. Jangan parse lalu JSON encode ulang sebelum verifikasi.
Server mencoba pengiriman awal lalu retry setelah 1 menit, 5 menit, 15 menit, 1 jam, dan 6 jam. Redirect callback tidak diikuti.
10. Praktik keamanan wajib
Secret hanya di backend
Jangan masukkan secret ke aplikasi mobile, JavaScript browser, log, screenshot, chat, atau repository.
Satu key per sistem
Pisahkan bot, website, staging, dan produksi agar satu key dapat dicabut tanpa mematikan semuanya.
Batasi IP produksi
Gunakan IP publik egress server yang stabil. Allowlist memakai pencocokan exact IPv4/IPv6, bukan CIDR.
Rotasi tanpa downtime
Buat key baru, pindahkan traffic, pastikan sukses, lalu nonaktifkan key lama. Secret lama tidak dapat dipulihkan.
Redaksi observability
Jangan catat sign, secret, raw callback, SN voucher, atau nomor tujuan lengkap pada log yang dibagikan.
Validasi callback
Tolak signature tidak valid, upsert berdasarkan ref_id, dan buat handler idempoten karena callback dapat diulang.
11. Troubleshooting
Gejala
Pemeriksaan
Selalu rc 41
Pastikan prefix benar, key aktif, akun tidak diblokir, ref_id untuk hash sama persis dengan body, urutan hash username+secret+ref_id, dan output MD5 berupa hex lowercase.
rc 42 di server produksi
Cari IP egress publik server. IP private/container sering berbeda dari IP yang terlihat server Gempay.
rc 43 terlalu cepat
Limit dihitung per key per menit kalender, bukan per IP. Gunakan antrean global untuk semua worker yang memakai key tersebut.
rc 54 pada tujuan
Cocokkan nama key, tipe, min/max, required, dan options dari input_fields SKU terbaru. Kirim angka sebagai string.
Transaksi timeout
Jangan buat ref_id baru. Retry transaction atau panggil status dengan key dan ref_id yang sama.
Callback 401
Pastikan HMAC memakai raw request body, secret key yang sama, SHA-256, output hex, dan perbandingan timing-safe.
Callback terus diulang
Balas HTTP 2xx setelah payload valid tersimpan. Respons 3xx tidak diikuti dan non-2xx dianggap gagal.
Harga berbeda dari web publik
Itu dapat benar: price-list memakai role harga pemilik key. Gunakan nilai price dari API sebagai biaya reseller.
Status lama setelah callback gagal
Panggil endpoint status. Kegagalan callback tidak mengubah status transaksi dan tidak memicu pemrosesan ulang.
12. Checklist sebelum go-live
Checklist ini berjalan di browser dan tidak disimpan. Gunakan sebagai pemeriksaan sebelum memindahkan traffic nyata.