Skip to main content

Order Prabayar & Topup Game

Endpoint untuk melakukan transaksi pulsa, paket data, dan voucher game.

Endpoint: POST /v1/transaction

Parameter Request​

ParameterTipeWajibKeterangan
api_idstring✅API ID
timestampinteger✅Unix timestamp
signaturestring✅HMAC-SHA256 — lihat cara membuat signature
cmdstring✅prepaid untuk Prabayar, game untuk Topup game
codestring✅Kode produk dari Daftar Produk
customer_nostring✅Nomor HP tujuan (pulsa/data) atau ID game (voucher)
nominalinteger❌*Nominal yang dipilih pelanggan. Wajib untuk produk dengan is_open_nominal: true (lihat Daftar Produk); abaikan untuk produk nominal tetap
voucher_codestring❌Kode voucher diskon yang ingin dipakai, jika ada
ref_idstring❌ID referensi unik — jika kosong di-generate otomatis
testingboolean❌true untuk mode testing (tidak potong saldo). Default: false
Produk Nominal Terbuka

Untuk produk dengan is_open_nominal: true (mis. transfer bank), sertakan parameter nominal sesuai jumlah yang dipilih pelanggan (harus di antara min_nominal dan max_nominal produk tersebut). Saldo yang terpotong = nominal + fee produk.

Contoh Request​

<?php
header('Content-Type: application/json');

$api_id = 'your_api_id';
$api_key = 'your_api_key';
$secret_key = 'your_secret_key';
$timestamp = time();

// Business params
$businessParams = [
'cmd' => 'prepaid',
'code' => 'TSEL5',
'customer_no' => '08123456789',
'ref_id' => 'UNIQUE_REF_ID_12345', // Opsional, untuk id unik di sistem Anda
'testing' => true, // Opsional, untuk mode testing (tidak memproses transaksi nyata)
// 'nominal' => 50000, // Wajib jika produk is_open_nominal: true
// 'voucher_code' => 'DISKON10RB', // Opsional, kode voucher diskon
];

// Urutkan A ke Z (ksort)
ksort($businessParams);

$canonicalBody = json_encode($businessParams, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
$bodyHash = hash('sha256', $canonicalBody);
$stringToSign = implode('|', [$api_id, $api_key, $timestamp, $bodyHash]);
$signature = hash_hmac('sha256', $stringToSign, $secret_key);

$payload = array_merge($businessParams, [
'api_id' => $api_id,
'timestamp' => $timestamp,
'signature' => $signature,
]);

$ch = curl_init('https://api.isikuota.com/v1/transaction');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
// print_r($response);
echo json_encode($response, JSON_PRETTY_PRINT);

Contoh Response​

code ≠ hasil akhir transaksi

code: ORDER_SUCCESS (success: true) berarti request berhasil diproses sistem — bukan jaminan produk berhasil terkirim. Selalu baca data.status untuk hasil transaksinya:

  • data.status: "success" — produk berhasil terkirim, sn terisi.
  • data.status: "pending" — masih diproses provider, cek ulang via /status atau tunggu callback.
  • data.status: "failed" — ditolak provider (mis. nomor tidak aktif). Saldo sudah dikembalikan otomatis. code tetap ORDER_SUCCESS karena request-nya sendiri berhasil diproses.

success: false (code: ORDER_FAILED, HTTP 400) hanya muncul jika request ditolak sebelum sempat diproses (saldo tidak cukup, produk tidak valid, PIN salah, rate limit, dll). Pada kasus ini data selalu null — tidak ada ref_id untuk dicek statusnya karena transaksi memang tidak pernah tercatat.

{
"success": true,
"code": "ORDER_SUCCESS",
"message": "Transaksi berhasil diproses",
"data": {
"ref_id": "TRX12345asdxxx",
"status": "success",
"customer_no": "08123456789",
"code": "TSEL5",
"name": "Telkomsel 20.000",
"price": 20425,
"sn": "1234-5678-9012-3456",
"created_at": "2026-05-31 10:34:36"
},
"errors": null,
"meta": null
}

Field Response​

FieldTipeKeterangan
ref_idstringID referensi transaksi
statusstringStatus transaksi (pending / success / failed)
customer_nostringNomor tujuan transaksi
codestringKode produk
namestringNama produk
priceintegerHarga jual penuh sebelum diskon voucher (Rp)
snstring/nullSerial Number / kode voucher (tersedia jika success)
created_atstringWaktu transaksi dibuat
voucher_discount_amountintegerHanya muncul jika voucher_code dengan tipe DISCOUNT dipakai — nominal potongan (Rp)
net_priceintegerHanya muncul bersamaan voucher_discount_amount — nominal saldo yang benar-benar terpotong (price - voucher_discount_amount)

Nilai data.status​

StatusKeteranganTindakan
pendingSedang diprosesTunggu callback atau cek via /status
successBerhasil — sn tersediaUpdate status di sistem Anda
failedGagal di provider — saldo dikembalikan otomatisNotifikasi user
warning

Jika request timeout, cek status dulu via /status menggunakan ref_id sebelum membuat transaksi baru. Transaksi mungkin sudah berhasil meski response tidak diterima.

Mode Testing

Tambahkan "testing": true untuk simulasi transaksi tanpa memotong saldo.