Bildirimat paneli > Webhooks sayfasında uç noktanızı tanımlayıp dinlemek istediğiniz olayları seçebilirsiniz:
| Event Adı | Tetiklenme Zamanı | Kullanım Alanı |
|---|---|---|
| notification.clicked | Kullanıcı gönderilen bildirime tıkladığında | Dönüşüm / Tıklama analitiği |
| notification.delivered | Bildirim kullanıcının cihazına başarıyla ulaştığında | İletim raporlaması |
| subscriber.subscribed | Yeni bir ziyaretçi push bildirimine izin verdiğinde | CRM senkronizasyonu / Hoş geldin akışı |
| subscriber.unsubscribed | Kullanıcı tarayıcı ayarlarından izni kapattığında | Veritabanı temizleme |
Her Webhook isteğinde gelen verinin gerçekten Bildirimat'tan geldiğinden emin olmanız için istek başlığında X-Bildirimat-Signature imzası gönderilir.
// İmzayı doğrulamak için:
$computed_signature = hash_hmac('sha256', $raw_payload, $webhook_secret);
if (hash_equals($computed_signature, $_SERVER['HTTP_X_BILDIRIMAT_SIGNATURE'])) { // İstek güvenli ve geçerli
} { "event": "notification.clicked", "app_id": "app_94857392", "timestamp": 1724806800, "data": { "notification_id": "notif_83749281", "subscriber_id": "sub_4981023", "user_id": "musteri_10485", "action_button": "btn_hemen_al", "target_url": "https://siteniz.com/kampanya", "device": { "browser": "Chrome", "os": "Android", "ip_country": "TR" } }
} { "event": "subscriber.subscribed", "app_id": "app_94857392", "timestamp": 1724806800, "data": { "subscriber_id": "sub_4981023", "user_id": null, "browser": "Safari", "browser_version": "17.4", "os": "macOS", "country": "TR", "city": "Istanbul" }
} <?php
// webhook.php
$webhook_secret = 'whsec_YOUR_SECRET_KEY';
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_BILDIRIMAT_SIGNATURE'] ?? ''; // 1. İmza doğrulaması
if (hash_hmac('sha256', $payload, $webhook_secret) !== $signature) { http_response_code(401); exit('Geçersiz İmza');
} $event = json_decode($payload, true); // 2. Olay tipine göre işlem yap
switch ($event['event']) { case 'notification.clicked': $userId = $event['data']['user_id']; // CRM'de kullanıcı hareketini güncelle break; case 'subscriber.subscribed': // Veritabanına yeni abone kaydı at break;
} // 3. Bildirimat sunucularına 200 OK dönün
http_response_code(200);
echo json_encode(['status' => 'received']);
?> const express = require('express');
const crypto = require('crypto');
const app = express(); app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; }
})); const WEBHOOK_SECRET = 'whsec_YOUR_SECRET_KEY'; app.post('/webhook', (req, res) => { const signature = req.headers['x-bildirimat-signature']; const expectedSig = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(req.rawBody) .digest('hex'); if (signature !== expectedSig) { return res.status(401).send('Geçersiz İmza'); } const { event, data } = req.body; console.log(`Alınan event: ${event}`, data); res.status(200).json({ status: 'received' });
}); app.listen(3000, () => console.log('Webhook dinleniyor: port 3000')); Sunucunuz 2xx durum kodu dönmediğinde (500 Internal Error, Timeout vb.), Bildirimat artan aralıklarla (10 saniye, 1 dakika, 5 dakika, 30 dakika) toplam 5 kez tekrar gönderim dener.