Paxvel Geliştiriciler
DokümanlarAPI referansıKonsol Giriş yap Erişim iste

Bildirimler (webhook)

Bildirimler rezervasyon değişikliklerini olur olmaz sisteminize iletir; sürekli sorgulamanız gerekmez.

Kurulum

Panelim → Bildirimler bölümüne bir HTTPS adresi girin — biri test, biri canlı için. Test adresine test rezervasyonlarının olayları, canlı adrese gerçek rezervasyonların olayları gelir. Test gönder ile hemen bir ping olayı alırsınız.

Gereksinimler: 443 portunda HTTPS, internetten erişilebilir adres ve 8 saniye içinde herhangi bir 2xx cevabı. Asıl işlemi cevap verdikten sonra arka planda yapın.

Olaylar

OlayNe zaman
booking.createdAPI ile rezervasyon oluşturuldu.
booking.updatedMüşterinin görebileceği bir şey değişti: durum, onay, şoför bilgisi, saat, fiyat, ödeme.
booking.cancelledRezervasyon iptal edildi (sizin ya da bizim tarafımızdan).
pingPortaldan ya da POST /test/webhook ile gönderilen test olayı.

İçerik

POST /paxvel/webhook HTTP/1.1
Content-Type: application/json
Paxvel-Event: booking.updated
Paxvel-Delivery: 81723
Paxvel-Signature: t=1763634612,v1=5f8a3b9e2c…
{
  "id": "evt_8f2c1a9b0d3e4f5a6b7c",
  "type": "booking.updated",
  "env": "live",
  "created_at": "2026-11-19T18:30:12+00:00",
  "data": { "reference": "PXT-01234", "status": "confirmed", "items": [ … ] }
}

data, rezervasyonun tamamıdır ve GET /bookings/{reference} cevabıyla birebir aynı biçimdedir. Sakladığınız kopyayı doğrudan değiştirebilirsiniz.

İmzayı doğrulama

Her istekte Paxvel-Signature: t=<unix zamanı>,v1=<imza> başlığı bulunur; v1, t + "." + ham gövde metninin imza anahtarınızla (Panelim → Bildirimler) hesaplanan HMAC-SHA256 değeridir (hex). İçeriğe güvenmeden önce mutlaka doğrulayın; tekrar saldırılarına karşı 5 dakikadan eski zamanları reddedin.

// PHP
[$t, $v1] = array_map(fn($p) => explode('=', $p, 2)[1], explode(',', $_SERVER['HTTP_PAXVEL_SIGNATURE']));
$body = file_get_contents('php://input');
$ok = hash_equals(hash_hmac('sha256', $t . '.' . $body, $secret), $v1) && abs(time() - (int)$t) < 300;
// Node.js (JSON'a çevirmeden önceki ham gövdeyi kullanın)
const [t, v1] = req.get('Paxvel-Signature').split(',').map(p => p.split('=')[1]);
const expected = crypto.createHmac('sha256', secret).update(t + '.' + rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected)) && Math.abs(Date.now() / 1000 - t) < 300;
# Python
t, v1 = [p.split("=", 1)[1] for p in request.headers["Paxvel-Signature"].split(",")]
expected = hmac.new(secret.encode(), f"{t}.".encode() + request.get_data(), hashlib.sha256).hexdigest()
ok = hmac.compare_digest(expected, v1) and abs(time.time() - int(t)) < 300

Tekrar deneme ve sıra

Adresiniz 2xx ile cevap vermezse 1 dakika, 5 dakika, 30 dakika, 2 saat, 6 saat ve 24 saat sonra tekrar deneriz; ardından gönderim başarısız sayılır (ilk denemeden yaklaşık 33 saat sonra) ve teknik iletişim adresinize e-posta göndeririz. Her gönderimi ve sonucunu Panelim → Bildirimler bölümünde görebilirsiniz.

Bildirimler birden fazla kez ya da sırası karışık gelebilir. Tekrarları olayın id değeriyle ayıklayın; data alanını değişiklik adımı olarak değil, güncel hal olarak kullanın.

İmza anahtarını yenileme

Yenile ve göster yeni bir anahtar oluşturur ve eskisini hemen geçersiz kılar. Yeniledikten hemen sonra yeni anahtarı sisteminize yükleyin.