Webhook Entegrasyonu
Ana panel üzerinde gerçekleşen randevu, profil, hizmet veya blog güncellemelerinin harici sitenize (doktoradi.com) anlık olarak bildirilmesi.
Genel Bakış
Ana platformda yönetici tarafından bir veri güncellendiğinde (örneğin bir randevu onaylandığında veya yeni bir blog yazısı eklendiğinde), bu değişikliğin harici sitenizde anında yansımasını sağlamak üzere web sitenizin webhook URL'ine bir HTTP POST isteği gönderilir.
Gönderilen tüm istekler, güvenliği sağlamak amacıyla HMAC-SHA256 imzalama yöntemi ile imzalanmaktadır. Alıcı sunucu, gelen isteğin gerçekten Randevu Ajandam sisteminden geldiğinden emin olmak için bu imzayı doğrulamalıdır.
Webhook İstek Yapısı
Gönderilen her webhook isteği aşağıdaki HTTP başlıklarını (headers) içerir:
| Başlık | Açıklama |
|---|---|
| X-Webhook-Event | Tetiklenen olay türü (örn: blog.created, appointment.approved). |
| X-Timestamp | İsteğin gönderildiği Unix Zaman Damgası (saniye cinsinden). |
| X-Webhook-Signature | İstek gövdesi ve zaman damgasıyla oluşturulan HMAC-SHA256 imzası. |
Payload (Body) Yapısı
Webhook gövdesi JSON formatında gönderilir ve şu alanları içerir:
{
"event": "blog.created",
"timestamp": 1783003200,
"data": {
"id": 42,
"baslik": "Yeni Sağlıklı Yaşam Kılavuzu",
"slug": "yeni-saglikli-yasam-kilavuzu",
"icerik": "Blog içeriği buraya gelir...",
"durum": "yayinlandi",
"created_at": "2026-07-03 13:28:00"
}
}
İmza Doğrulama Algoritması
İmza doğrulaması için alıcı sunucunun yapması gereken adımlar şunlardır:
- Gelen HTTP istek başlıklarından
X-TimestampveX-Webhook-Signaturedeğerlerini alın. - Gelen ham istek gövdesini (raw request body) olduğu gibi metin (string) olarak okuyun.
X-Timestampdeğeri ile ham istek gövdesini sırayla birleştirin (Concatenate):payload = timestamp + rawBody- Bu birleşik metni, size tanımlanan Webhook Secret Key değerini kullanarak HMAC-SHA256 algoritmasından geçirin.
- Ürettiğiniz imza ile
X-Webhook-Signaturebaşlığındaki imzayı karşılaştırın. Güvenlik için zamanlama saldırılarına karşı korumalı bir karşılaştırma fonksiyonu (hash_equals) kullanın.
Kod Örnekleri
Alıcı sunucuda imza doğrulamasını gerçekleştirecek örnek kod yapıları:
<?php
// 1. Webhook Secret Key değeriniz
$webhookSecret = 'YOUR_WEBHOOK_SECRET_KEY';
// 2. HTTP Başlıklarını Alın
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
// 3. Ham İstek Gövdesini Okuyun
$rawBody = file_get_contents('php://input');
// 4. Zaman aşımı kontrolü (Replay Attack koruması için önerilen +/- 5 dk)
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(401);
die('İstek zaman aşımı.');
}
// 5. İmzayı Hesaplayın
$payloadToSign = $timestamp . $rawBody;
$calculatedSignature = hash_hmac('sha256', $payloadToSign, $webhookSecret);
// 6. Güvenli Karşılaştırma Yapın
if (hash_equals($calculatedSignature, $signature)) {
// İmza geçerli, isteği işleyebilirsiniz
$data = json_decode($rawBody, true);
$event = $data['event'];
$modelData = $data['data'];
// İş mantığınız...
http_response_code(200);
echo 'Başarılı';
} else {
// Geçersiz imza
http_response_code(401);
echo 'Geçersiz imza.';
}