Cara Xero mengirim webhook

Xero meminta 200 dalam 5 detik tanpa body, dan 401 untuk tanda tangan yang salah, sebelum mengaktifkan webhook. Format terverifikasi dan verifier Node.

Perilaku pengiriman

Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.

Batas waktu respons5 detik

200 dalam 5 detik, tanpa body dan tanpa cookie; 401 jika tanda tangannya salah

Periksa apakah handler Anda menjawab tepat waktu

Percobaan ulangtidak dipublikasikan vendor
Berhenti mencobatidak dipublikasikan vendor
Sumberhttps://developer.xero.com/documentation/guides/webhooks/configuring-your-server/

Tanda tangan

Diverifikasi dengan verifier yang berfungsi dan dibuktikan oleh test suite, bukan dibaca dari dokumentasi. Terakhir diverifikasi 2026-08-20.

AlgoritmaHMAC-SHA256
Payload bertanda tanganraw body
Encodingbase64
Headerx-xero-signature = base64
Toleransitidak diberlakukan

Verifikasi

Raw body dari permintaan, byte demi byte, sebelum parsing JSON apa pun. Setiap skema di halaman ini rusak begitu framework melakukan serialisasi ulang pada payload.

const crypto = require("node:crypto");

// base64(HMAC-SHA256(webhooks key, raw body))
const expected = crypto
  .createHmac("sha256", webhooksKey) // developer.xero.com → My Apps → Webhooks
  .update(rawBody)
  .digest("base64");
const received = Buffer.from(req.headers["x-xero-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
  received.length === wanted.length && crypto.timingSafeEqual(received, wanted);
// Intent to Receive needs both answers: 200 (empty body) when valid, 401 when not.

Yang sering menjebak

Webhook tetap nonaktif sampai Intent to Receive lolos: Xero mengirim satu pengiriman dengan tanda tangan yang benar dan satu yang sengaja ditandatangani salah, lalu meminta 200 untuk yang pertama dan 401 untuk yang kedua. Endpoint yang menjawab 200 untuk semuanya tidak pernah aktif. Jika sumber Xero dan webhooks key sudah diatur, AnyHook menjawab keduanya sendiri dan tidak menyimpan satu pun.

Satu pengiriman adalah batch berisi pointer, bukan record: setiap event menyebut kategori, jenis, dan resourceUrl yang harus diambil dengan panggilan terautentikasi. AnyHook menamai event sesuai event pertama dalam batch (invoice.update), sehingga filter dan log event terbaca dengan cara yang sama.

Baca juga

AnyHook berada di depan endpoint yang menerima webhook dari Xero: AnyHook menjawab dalam sekitar satu detik, mencoba ulang sesuai jadwalnya sendiri saat server Anda mati, dan menyimpan setiap event agar dapat diputar ulang (replay). Ganti satu URL, kode Anda tetap.

Cara kerjanya →