Callback
Pemberitahuan otomatis dari kami ke server Anda saat transaksi selesai.
Callback adalah pemberitahuan otomatis dari kami ke server Anda saat sebuah transaksi sudah selesai (berhasil atau gagal). Dengan callback, Anda tidak perlu menanyakan status berulang kali.
Cara mengaktifkan
- 1Siapkan alamat di server AndaBuat satu alamat yang bisa menerima request POST dari internet, mis.
https://situsanda.com/zeval-callback. Wajib HTTPS dan bisa diakses publik (bukan localhost atau IP lokal). - 2Daftarkan di dashboardBuka menu Kredensial API, isi kolom Callback URL dengan alamat tadi, lalu simpan.
- 3Terima dan balasSetiap kali transaksi API Anda selesai, kami mengirim data transaksi ke alamat itu. Balas dengan HTTP 200.
Data yang kami kirim
Kami mengirim POST dengan body JSON. Isinya sama dengan data transaksi di respons API, ditambah signature.
Body callback
{
"trx_id": "TRX261005P5KZ4H",
"ref_id": "INV-1001",
"product_code": "OKD1",
"product_name": "DANA 1.000",
"destination": "081234567890",
"price": 1400,
"status": "success",
"sn": "1234567890",
"message": "Transaksi berhasil.",
"signature": "5d41402abc4b2a76b9719d911017c592"
}| Parameter | Tipe | Keterangan |
|---|---|---|
ref_id | string | Nomor transaksi dari sistem Anda. Pakai ini untuk mencari pesanan Anda. |
status | string | success atau failed. (Callback tidak dikirim untuk status pending.) |
sn | string | null | Serial number / token bila ada. |
signature | string | md5(secret_id:secret_key:ref_id). Gunakan untuk memastikan callback benar-benar dari kami. |
Contoh penerima callback
Contoh di bawah memeriksa signature, memproses hasilnya, lalu membalas 200.
PHP
<?php
// File ini adalah alamat Callback URL Anda.
$secretId = 'SECRET_ID_ANDA';
$secretKey = 'SECRET_KEY_ANDA';
$data = json_decode(file_get_contents('php://input'), true) ?? [];
// 1. Cek signature: md5(secret_id:secret_key:ref_id)
$expected = md5($secretId . ':' . $secretKey . ':' . ($data['ref_id'] ?? ''));
if (! hash_equals($expected, (string) ($data['signature'] ?? ''))) {
http_response_code(401);
exit;
}
// 2. Proses hasilnya (cukup sekali per ref_id, callback bisa datang lebih dari sekali)
if ($data['status'] === 'success') {
// tandai pesanan $data['ref_id'] berhasil, simpan $data['sn']
} elseif ($data['status'] === 'failed') {
// tandai pesanan gagal, kembalikan dana ke pelanggan Anda
}
// 3. Balas 200 agar kami tahu callback sudah diterima
http_response_code(200);
echo 'OK';Node.js
const crypto = require('crypto');
const express = require('express');
const app = express();
const secretId = 'SECRET_ID_ANDA';
const secretKey = 'SECRET_KEY_ANDA';
app.post('/zeval-callback', express.json(), (req, res) => {
const data = req.body;
// 1. Cek signature: md5(secret_id:secret_key:ref_id)
const expected = crypto.createHash('md5')
.update(`${secretId}:${secretKey}:${data.ref_id}`).digest('hex');
if (expected !== data.signature) return res.sendStatus(401);
// 2. Proses hasilnya (cukup sekali per ref_id, callback bisa datang lebih dari sekali)
if (data.status === 'success') {
// tandai pesanan data.ref_id berhasil, simpan data.sn
} else if (data.status === 'failed') {
// tandai pesanan gagal, kembalikan dana ke pelanggan Anda
}
// 3. Balas 200 agar kami tahu callback sudah diterima
res.status(200).send('OK');
});Python
import hashlib
from flask import Flask, request
app = Flask(__name__)
SECRET_ID = "SECRET_ID_ANDA"
SECRET_KEY = "SECRET_KEY_ANDA"
@app.post("/zeval-callback")
def zeval_callback():
data = request.get_json(silent=True) or {}
# 1. Cek signature: md5(secret_id:secret_key:ref_id)
raw = f"{SECRET_ID}:{SECRET_KEY}:{data.get('ref_id', '')}"
if hashlib.md5(raw.encode()).hexdigest() != data.get("signature"):
return "", 401
# 2. Proses hasilnya (cukup sekali per ref_id, callback bisa datang lebih dari sekali)
if data["status"] == "success":
pass # tandai pesanan berhasil, simpan data["sn"]
elif data["status"] == "failed":
pass # tandai pesanan gagal, kembalikan dana ke pelanggan Anda
# 3. Balas 200 agar kami tahu callback sudah diterima
return "OK", 200Hal yang perlu diperhatikan
- Selalu cek signature. Tolak (HTTP 401) callback yang signature-nya tidak cocok, karena bisa saja dikirim orang lain.
- Balas HTTP 2xx (mis. 200) bila callback sudah diterima. Jawaban lain dianggap gagal.
- Callback gagal akan dikirim ulang otomatis dengan jeda 1 menit, 5 menit, 15 menit, 1 jam, lalu 6 jam (maksimal 6 kali).
- Callback bisa datang lebih dari sekali untuk transaksi yang sama. Pastikan pemrosesannya aman diulang (cek dulu apakah pesanan itu sudah Anda proses).
- Bila callback terlewat, Anda tetap bisa memastikan lewat Cek Status Transaksi. Di detail transaksi pada dashboard juga ada tombol Kirim ulang callback.