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
| Olay | Ne zaman |
|---|---|
booking.created | API ile rezervasyon oluşturuldu. |
booking.updated | Müşterinin görebileceği bir şey değişti: durum, onay, şoför bilgisi, saat, fiyat, ödeme. |
booking.cancelled | Rezervasyon iptal edildi (sizin ya da bizim tarafımızdan). |
ping | Portaldan 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)) < 300Tekrar 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.