Zeval Digital
Dokumentasi API
Mulai
Pengenalan Autentikasi Kode Respons
Endpoint
Cek Saldo Kategori & Brand Daftar Produk Buat Transaksi Cek Tagihan Bayar Tagihan Cek Status Transaksi Callback
Dokumentasi›API V1
v1 Kredensial API Masuk

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

  1. 1
    Siapkan 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).
  2. 2
    Daftarkan di dashboardBuka menu Kredensial API, isi kolom Callback URL dengan alamat tadi, lalu simpan.
  3. 3
    Terima 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"
}
ParameterTipeKeterangan
ref_idstringNomor transaksi dari sistem Anda. Pakai ini untuk mencari pesanan Anda.
statusstringsuccess atau failed. (Callback tidak dikirim untuk status pending.)
snstring | nullSerial number / token bila ada.
signaturestringmd5(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", 200

Hal 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.
← SebelumnyaCek Status Transaksi