Dokumentasi API

Beranda/Dokumentasi API
API CHARGING V2

Panduan integrasi pengiriman kartu

Dokumentasi bagi Merchant untuk mengirim kartu, memeriksa status transaksi, dan mengambil biaya sesuai akun.

ENDPOINT UTAMAhttps://toctoico.com/chargingws/v2

1. Ringkasan integrasi

InformasiNilai
Endpoint utamahttps://toctoico.com/chargingws/v2
API daftar biayahttps://toctoico.com/chargingws/v2/getfee?partner_id=YOUR_PARTNER_ID
MethodPOST
Tipe dataapplication/json atau application/x-www-form-urlencoded
Perintah yang didukungcharging, check

2. Persyaratan sebelum memanggil API

Kompatibel dengan protokol Nappay: ubah URL ke website ini dan gunakan Partner ID/Key serta kode dompet Merchant di sini. Katalog, harga, dan ketentuan pemrosesan mengikuti sistem ini.

Integrasikan langsung ke sistem ini memakai Merchant akun Anda. Semua nominal dalam dong Vietnam (VND), kirim bilangan bulat tanpa pemisah.

  1. Login → Koneksi API / Merchant, buat Merchant untuk layanan yang sesuai lalu aktifkan.
  2. Ambil Partner ID, Partner Key, dan kode dompet dari Merchant tersebut. Jika menggunakan daftar IP yang diizinkan, daftarkan IP publik server pengirim request.
  3. Atur URL callback HTTPS pada sistem penerima hasil; pilih POST JSON atau GET sesuai Merchant.
  4. Ambil katalog/biaya dan periksa saldo terlebih dahulu; lalu integrasikan pembuatan pesanan, pencarian, dan rekonsiliasi.

Partner Key hanya digunakan di server Anda. Jangan menaruh secret dalam JavaScript browser, aplikasi publik, atau URL. YOUR_PARTNER_ID, YOUR_PARTNER_KEY, YOUR_WALLET di bawah merupakan tempat mengisi informasi Merchant Anda sendiri di web ini.

Endpoint penukaran kartu, top up, dan pembelian kode voucher
LayananEndpointFormat
Penukaran kartuhttps://toctoico.com/chargingws/v2POST JSON atau form-urlencoded
Top uphttps://toctoico.com/api/rechargewsPOST JSON atau form-urlencoded
Beli kode voucherhttps://toctoico.com/api/cardwsPOST JSON atau form-urlencoded
Biaya penukaran kartuhttps://toctoico.com/chargingws/v2/getfee?partner_id=YOUR_PARTNER_IDGET
Katalog kode voucherhttps://toctoico.com/api/cardws/products?partner_id=YOUR_PARTNER_IDGET

3. Tanda tangan autentikasi

Buat tanda tangan MD5 dari string UTF-8 yang digabung tepat sesuai urutan di bawah, tanpa titik, spasi, atau pemisah. Kirim string hex MD5; gunakan command dengan huruf kecil persis seperti dokumentasi.

Grup perintahString untuk hash MD5
Tukar kartu: chargingpartner_key + code + command + partner_id + request_id + serial + telco
Tukar kartu: checkpartner_key + command + partner_id + request_id
Tukar kartu: tanda tangan lama tetap didukungpartner_key + code + serial
Topup: topup, getstatuspartner_key + partner_id + command + request_id
Topup: productlist, getbalance, feetopup, canceltopuppartner_key + partner_id + command
Kode voucher: buycard, redownloadpartner_key + partner_id + command + request_id
Kode voucher: getbalance, checkavailablepartner_key + partner_id + command
Katalog kode voucher, getfeeAutentikasi Merchant/IP melalui partner_id; endpoint saat ini tidak memerlukan sign
Pencarian serial /api/checkcardpartner_key + serial
Python
hashlib.md5((partner_key + partner_id + command + request_id).encode("utf-8")).hexdigest()

Setiap Merchant hanya memakai jenis API yang terdaftar (Charging, Recharge, Softcard, atau All). Error autentikasi/IP dapat muncul dalam JSON meskipun HTTP 200.

4. Parameter dan respons penukaran kartu

POST /chargingws/v2

Kirim kartu dengan command=charging. Periksa menggunakan command=check dengan partner_id, request_id, dan sign sesuai tabel di atas; tidak perlu mengirim ulang informasi kartu. Tanda tangan lama MD5(partner_key + code + serial) tetap didukung jika code dan serial disertakan.

ParameterPermintaanArti / nilai
partner_id, signWajibMerchant dan tanda tangan layanan penukaran kartu
commandWajibcharging atau check
request_idWajibKode permintaan unik per Merchant; check memakai ulang kode lama
telcoKhi chargingKode operator huruf besar; ambil dari getfee
amountKhi chargingNominal yang dinyatakan; boleh diabaikan saat check
code, serialKhi chargingString kode kartu/serial, pertahankan angka 0 di awal; check harus mengirim string awal yang persis sama
json
{
  "partner_id": "YOUR_PARTNER_ID",
  "command": "charging",
  "request_id": "CHARGE_DEMO_001",
  "telco": "VIETTEL",
  "amount": 100000,
  "code": "YOUR_CARD_CODE",
  "serial": "YOUR_CARD_SERIAL",
  "sign": "MD5_THEO_CONG_THUC_CHARGING"
}

Periksa kembali transaksi

json
{
  "partner_id": "YOUR_PARTNER_ID",
  "command": "check",
  "request_id": "CHARGE_DEMO_001",
  "sign": "MD5_PARTNER_KEY_CHECK_PARTNER_ID_REQUEST_ID"
}

Respons transaksi

json
{
  "trans_id": 123,
  "request_id": "CHARGE_DEMO_001",
  "status": 99,
  "message": "PENDING",
  "declared_value": 100000,
  "value": 0,
  "amount": 0,
  "telco": "VIETTEL",
  "code": "YOUR_CARD_CODE",
  "serial": "YOUR_CARD_SERIAL",
  "callback_sign": "MD5_PARTNER_KEY_CODE_SERIAL"
}
ParameterPermintaanArti / nilai
trans_id, request_idDiterimaKode transaksi sistem dan kode permintaan Anda
declared_valueDiterimaNominal yang dinyatakan
valueDiterimaNominal aktual terkonfirmasi
amountDiterimaJumlah bersih yang diterima dompet setelah pemrosesan
status, messageDiterimaStatus kartu atau error; selalu periksa keduanya
statusArti
99Menunggu; belum dikreditkan seperti pesanan berhasil
1Kartu valid, berhasil
2Kartu valid tetapi nominal salah
3Kartu gagal / tidak valid
4Lewati / pemeliharaan berdasarkan hasil pemrosesan
100Error permintaan
101Transaksi tidak ditemukan
102Autentikasi, IP, atau data salah
104Perintah tidak valid

Daftar biaya per Merchant

GET /chargingws/v2/getfee?partner_id=YOUR_PARTNER_ID. Respons berupa daftar datar berisi telco, value, fees, dan penalty, kompatibel dengan Nappay. Integrasi lama yang memerlukan object berkelompok dapat menambahkan format=grouped. fees adalah biaya pelanggan sesuai grup akun; hanya jenis kartu/nominal yang aktif yang dikembalikan. Jangan menetapkan katalog atau biaya secara permanen berdasarkan contoh dokumentasi.

json
[
  {
    "telco": "VIETTEL",
    "value": 100000,
    "fees": "18.5",
    "penalty": "50"
  }
]

Biaya grup ditetapkan saat kartu diterima. Untuk nominal salah (status=2), penalti 50% dikenakan pada penerimaan setelah biaya grup: diterima = nominal yang dikonfirmasi penyedia × (100 − biaya grup)% × 50%, dibulatkan ke bawah ke satuan dong. Contoh 10.000đ, biaya grup 26,8%: diterima 3.660đ. Gunakan amount hasil final untuk mengkreditkan dana; jangan menghitung ulang dari nominal yang dinyatakan. Pesanan manual dapat tetap berstatus 99 hingga operator mengonfirmasi; pencarian/callback menjadi dasar pembaruan final.

5. Callback dan rekonsiliasi

Daftarkan URL callback Anda pada Merchant di web ini. Sistem mengirim hasil penukaran kartu/top up lewat POST JSON atau GET sesuai konfigurasi Merchant. Callback dapat dikirim ulang; tangani duplikat dengan aman berdasarkan kode pesanan dan status.

LayananPeriksa callback_signKolom utama
Tukar kartuMD5(partner_key + code + serial)status, message, request_id, trans_id, declared_value, value, amount, telco, code, serial
TopupMD5(partner_key + order_code)status, request_id, order_code, request_value, amount, account

Callback top up memakai status=completed untuk pesanan berhasil; request_value adalah nominal top up yang diminta dan amount adalah jumlah dibayar jika penawaran final tersedia. Pencarian pesanan dapat mengembalikan data.status=success untuk hasil yang sama. Callback GET penukaran kartu juga menyertakan card_value.

json
{
  "status": "completed",
  "request_id": "TOPUP_DEMO_001",
  "order_code": "R_DEMO_ORDER",
  "request_value": 100000,
  "amount": 92500,
  "account": {
    "game_id": "PLAYER_ID"
  },
  "callback_sign": "MD5_PARTNER_KEY_ORDER_CODE"
}
  1. Verifikasi tanda tangan dengan secret Merchant yang sesuai dan bandingkan secara aman; pastikan kode pesanan milik sistem Anda.
  2. Panggil check/getstatus untuk mengonfirmasi status serta mencocokkan nominal/jumlah uang sebelum mencatat hasil. Tanda tangan kompatibel tidak mencakup seluruh kolom status.
  3. Catat dalam transaksi database, cegah pencatatan/pengkreditan ganda, lalu segera kembalikan HTTP 2xx.
  4. Jika callback terlambat atau hilang, periksa secara berkala; jangan menganggap koneksi terputus sebagai kegagalan dan jangan membuat pesanan baru.

Antrean callback mencoba ulang maksimal 12 kali dengan jeda bertambah. Callback top up juga bergantung pada pengaturan callback produk. Hasil pembelian kode voucher diterima melalui buycard/redownload.

Python
import hashlib, hmac
expected = hashlib.md5((partner_key + payload["order_code"]).encode()).hexdigest()
valid = hmac.compare_digest(expected, str(payload.get("callback_sign", "")).lower())

6. Kode error dan pemecahan masalah

Baca kode HTTP, status, message, dan status transaksi dalam data. Jangan memakai satu tabel status untuk semua layanan: misalnya top up memakai string, sedangkan kode voucher memakai angka.

Kode error umumPenyebab
100Produk tidak ditemukan atau permintaan penukaran kartu error; baca message
101Dompet elektronik tidak ditemukan
102Saldo dompet tidak cukup
103Data tidak lengkap
104Data yang dikirim tidak benar
108Merchant tidak ditemukan, nonaktif, atau tidak valid
109request_id sudah ada
110Permintaan tidak valid, jenis Merchant salah, atau pesanan tidak ditemukan
111wallet_number tidak cocok di API kode voucher
116Tanda tangan salah
117command tidak ada/salah
118Stok produk habis atau layanan belum tersedia
114IP tidak diizinkan
129Pesanan kode voucher tidak ditemukan
130Error penyedia
125Jumlah tidak valid
126Jumlah harus berupa bilangan bulat positif
SituasiPenanganan
HTTP 400Periksa data, kolom pelanggan, batas nominal, dan pilihan produk
HTTP 409 / request_id duplikatPeriksa pesanan lama; jangan kirim payload berbeda dengan kode yang sudah dipakai
HTTP 503 / timeoutPertahankan kode permintaan dan rekonsiliasi sebelum mencoba lagi; status pengiriman ke penyedia mungkin belum jelas
API success tetapi masih pendingTerus pantau status/callback; transaksi belum selesai
Sai signPeriksa secret layanan yang benar, urutan penggabungan, request_id, dan UTF-8
Harga berbeda dari tampilan sebelumnyaAmbil ulang katalog sesuai Merchant; harga ditetapkan saat pesanan diterima

Berikan jarak minimal beberapa detik antar pemeriksaan dan tambah jeda jika hasil belum tersedia. request_id harus dibuat dan disimpan oleh server Anda sebelum dikirim. Jangan menggunakan pembelian nyata untuk memeriksa koneksi; productlist/getbalance/getfee merupakan pemeriksaan hanya baca.

7. Contoh kode

Contoh Python memanggil getbalance dengan aman untuk pemeriksaan koneksi (instal requests dengan pip install requests). Gunakan variabel lingkungan untuk data privat; jangan menulis secret dalam source code.

Python
import os, hashlib, requests
BASE = "https://toctoico.com"
partner_id = os.environ["GACHTHE_PARTNER_ID"]
partner_key = os.environ["GACHTHE_PARTNER_KEY"]

def recharge(command, **fields):
    request_id = str(fields.get("request_id", "")) if command in ("topup", "getstatus") else ""
    sign = hashlib.md5((partner_key + partner_id + command + request_id).encode()).hexdigest()
    payload = {**fields, "partner_id": partner_id, "command": command, "sign": sign}
    response = requests.post(BASE + "/api/rechargews", json=payload, timeout=20)
    result = response.json()
    response.raise_for_status()
    return result

print(recharge("getbalance"))
# Lưu request_id trước khi gọi topup. Sau đó lưu order_code trả về.
# Khi timeout: tra cứu/đối soát, không tạo request_id mới để mua lại.

PHP: tanda tangan dan pengiriman JSON

PHP
<?php
$partnerId = getenv('GACHTHE_PARTNER_ID');
$partnerKey = getenv('GACHTHE_PARTNER_KEY');
$command = 'getbalance';
$payload = ['partner_id' => $partnerId, 'command' => $command,
    'sign' => md5($partnerKey . $partnerId . $command)];
$ch = curl_init('https://toctoico.com/api/rechargews');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_TIMEOUT => 20]);
$body = curl_exec($ch);
if ($body === false) { throw new RuntimeException('Chưa xác nhận được phản hồi API'); }
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
// Kiểm tra $status, $result['status'] và trạng thái đơn trong data nếu có.

cURL

cURL
curl --request POST 'https://toctoico.com/api/rechargews' \
  --header 'Content-Type: application/json' \
  --data '{"partner_id":"YOUR_PARTNER_ID","command":"getbalance","sign":"YOUR_COMPUTED_MD5"}' 

Penukaran kartu memakai rumus charging/check khusus pada tabel tanda tangan; rumus lama MD5(partner_key + code + serial) tetap didukung. Untuk membeli kode voucher, gunakan aturan penggabungan pada tabel tanda tangan dan endpoint /api/cardws.

8. Pencarian serial

POST /api/checkcard. Hanya tersedia jika admin mengaktifkan fitur dan memberikan izin kepada Merchant; kemampuan pencarian, batas, serta informasi yang dikembalikan bergantung pada konfigurasi yang disetujui. Jangan menyimpulkan kartu belum digunakan hanya dari respons yang tidak lengkap.

ParameterPermintaanArti / nilai
partner_idWajibMerchant dengan izin
telcoKhi chargingKode jenis kartu
serialWajibString serial
signWajibMD5(partner_key + serial)
json
{
  "partner_id": "YOUR_PARTNER_ID",
  "telco": "VIETTEL",
  "serial": "YOUR_CARD_SERIAL",
  "sign": "MD5_PARTNER_KEY_SERIAL"
}

Periksa status, message, dan data yang benar-benar dikembalikan. Jangan menganggapnya API top up voucher atau pemeriksaan PIN; jangan memberikan izin sendiri atau melakukan pencarian massal.

Dokumentasi sesuai API sistem · Diperbarui 30/10/2026 · Contoh kode dan harga hanya ilustrasi.