T4TopupH2H API

Webhook

Menerima callback status order dan memverifikasi tanda tangan HMAC.

Saat status invoice mencapai kondisi final (misalnya SUCCESS, FAILED, REFUNDED), sistem mengirim HTTP POST ke URL callback Anda.

Prioritas URL callback

  1. callback_url pada request order
  2. Callback default di pengaturan akses H2H Anda
  3. Callback default akun (fallback)

Headers

HeaderArti
X-Webhook-EventJenis event, contoh invoice.status_changed
X-Webhook-IdID pengiriman / job
X-Webhook-TimestampUnix timestamp (detik)
X-Tenant-IdID akun
X-Tenant-Member-IdID member Anda
X-Webhook-SignatureHMAC-SHA256 hex dari timestamp + "." + raw_body

Signature dihitung memakai API secret akses H2H Anda.

Contoh body

{
  "event": "invoice.status_changed",
  "data": {
    "invoice_number": "API123...",
    "partner_ref": "ORDER-1001",
    "status": "SUCCESS",
    "amount": 10000,
    "target": "123(456)",
    "serial_number": "...",
    "member_id": "...",
    "member_role": "RESELLER",
    "updated_at": "2026-07-21T10:00:00.000Z"
  }
}

Verifikasi signature

import crypto from 'node:crypto';

function verifyWebhook({ apiSecret, timestamp, signature, rawBody }) {
  const expected = crypto
    .createHmac('sha256', apiSecret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex');

  if (expected !== signature) {
    throw new Error('Invalid webhook signature');
  }
}

// const timestamp = req.headers['x-webhook-timestamp'];
// const signature = req.headers['x-webhook-signature'];
// const rawBody = req.rawBody; // string JSON mentah
// verifyWebhook({ apiSecret, timestamp, signature, rawBody });

Tips implementasi

  • Selalu verifikasi signature sebelum memproses event
  • Gunakan raw body persis seperti yang diterima
  • Buat endpoint webhook idempotent — event yang sama bisa dikirim ulang
  • Balas cepat dengan 2xx; proses berat sebaiknya di-queue
  • Simpan partner_ref / invoice_number sebagai kunci update di database Anda

On this page