Webhook Events

Panel'de gerçekleşen olayları kendi sistemlerinize HTTP POST ile iletir. Tüm istekler HMAC-SHA256 ile imzalanır, başarısız teslimler exponential backoff ile 5 kez denenir.

36
Toplam event
5
Maks deneme
6.5sa
Max backoff
10s
İstek timeout

Kayıt & başlangıç

Webhook URL'i ve dinlenecek event listesi /webhooks.php sayfasından eklenir (admin yetkisi gerekir). Her endpoint için otomatik üretilen secret imza doğrulamada kullanılır. Wildcard destekli: "*" tüm olaylar, "hardware.*" tek entity'nin tüm aksiyonları.

İmzalama

Her POST isteği aşağıdaki header'ları içerir:

POST https://yourapp.example/webhook
Content-Type: application/json
User-Agent: TeknikDanisman-Webhook/1.0
X-TD-Event: hardware.created
X-TD-Signature: sha256=<HMAC_SHA256(body, secret)>
X-TD-Delivery: <16 hex>
X-TD-Signature-Previous: sha256=<...>   # opsiyonel — secret rotation grace period

Doğrulama (Node.js örneği):

const crypto = require('crypto');
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-td-signature']));

Secret rotation

Secret'i değiştirdiğinizde eski secret 72 saat boyunca X-TD-Signature-Previous header'ı ile gönderilmeye devam eder — yeni secret'a kademeli geçiş yapabilirsiniz.

Retry politikası

5xx yanıt veya non-2xx alındığında deneme tekrar kuyruğa alınır. Backoff dizisi (saniye):

[ 60, 300, 900, 3600, 21600 ]   # 1dk → 5dk → 15dk → 1sa → 6sa

5. denemeden sonra teslim permanently failed olarak işaretlenir ve /webhook_deliveries.php sayfasından manuel retry edilebilir.

Payload zarf formatı

{
  "event": "hardware.created",
  "data": { /* event-specific payload */ },
  "fired_at": "2026-06-22 14:23:01",
  "tenant_id": 42
}

Resource olayları

Tüm CRUD operasyonları aşağıdaki entity'ler için otomatik webhook tetikler. Olay adı <entity>.<action> formatındadır.

EntityTürkçeAçıklama
customer Müşteri Bir müşteri kaydı
employee Personel Bir personel kaydı
hardware Donanım Bir donanım varlığı
license Lisans Yazılım lisansı veya abonelik kaydı
service Hizmet Hizmet/sözleşme kaydı (DNS, hosting vb.)
server Sunucu Sunucu envanteri kaydı
payment Ödeme Ödeme/tahsilat kaydı
insurance_policy Sigorta Poliçesi Sigorta poliçesi/evrak kaydı
hr_leave İK İzin Talebi Personel izin talebi
hr_warning İK İhtar Personel ihtarı/disiplin kaydı

Aksiyonlar

ActionTetikleyici
created Oluşturuldu Yeni kayıt eklendiğinde
updated Güncellendi Mevcut kayıt değiştirildiğinde
deleted Silindi Kayıt silindiğinde

Örnek payload — hardware.created

{
  "event": "hardware.created",
  "data": {
    "id": 1284,
    "entity_id": 1284,
    "actor_user_id": 7,
    "actor_email": "admin@firma.com",
    "changes": { "brand": "Lenovo", "model": "T14s", "serial": "PF1A2B3C" }
  },
  "fired_at": "2026-06-22 14:23:01",
  "tenant_id": 42
}

Destek talebi olayları

Müşteri destek modülünün yaydığı olaylar — SLA/CRM entegrasyonu için kullanışlıdır.

EventTetikleyici
support_ticket.created Yeni talep oluşturuldu (panel UI, e-posta inbox veya müşteri portalı).
support_ticket.replied Talebe yanıt eklendi (agent veya talep sahibi).
support_ticket.status_changed Talep statüsü değişti (open → pending, vb.) ancak close değil.
support_ticket.closed Talep kapatıldı.
support_ticket.assigned Talep bir agent'a atandı veya başka agent'a devredildi.

Örnek payload — support_ticket.replied

{
  "event": "support_ticket.replied",
  "data": {
    "id": 88,
    "ticket_number": "TKT-2026-0088",
    "subject": "Outlook senkron sorunu",
    "status": "open",
    "priority": "high",
    "category": "email",
    "customer_id": 12,
    "requester_name": "Ayşe Yılmaz",
    "assigned_to": 7,
    "extra": { "author_id": 7, "body_preview": "Şimdi tekrar deneyebilir misiniz..." }
  },
  "fired_at": "2026-06-22 14:25:14",
  "tenant_id": 42
}

Sistem olayları

EventAçıklama
webhook.test webhooks.php → "Test Et" butonundan manuel tetiklenen test eventi. Production akışında üretilmez.

Teslim güvenliği

Idempotency

Aynı event aynı endpoint'e en fazla bir kez teslim edilir (queue PK). Retry'lar farklı X-TD-Delivery ID üretir; receiver tarafta delivery ID'yi 24 saat saklayarak duplicate ignore edebilirsiniz.

Rate limit

Her webhook endpoint'i için varsayılan 60 istek/dakika sınırı uygulanır. Aşıldığında o dakika boyunca yeni teslim ertelenir. /webhooks.php sayfasından endpoint başına özelleştirilebilir.

Timeout

Receiver'ın 10 saniye içinde 2xx yanıt vermesi gerekir. Daha uzun işlem için 200 OK döndürüp arka planda işleyin (async pattern).

Sorun giderme

Bu sayfa lib/Audit.php ve lib/SupportTickets.php kaynak kodu ile manuel hizalanmıştır. Eklenmesi planlanan yeni olaylar için bkz. roadmap.