Ana içeriğe geç

Webhooks

Webhook'lar, sunucunuzu sürekli sorgulamak (polling) yerine olayları anlık olarak almanızı sağlar. Bir olay gerçekleştiğinde Rabisu, kayıtlı URL'nize imzalı bir POST isteği gönderir.

1. Endpoint Kaydı — POST /webhooks

curl -X POST https://api.rabisu.com/api/v1/webhooks \
-u "rsk_live_xxx:rsks_yyy" \
-H "Content-Type: application/json" \
-d '{
"url": "https://bayi.com/modules/addons/rabisu/webhook.php",
"event_types": ["service.*", "credit.added"],
"description": "Üretim webhook"
}'

Yanıtta HMAC secret yalnızca bir kez döner — güvenli saklayın:

{
"success": true,
"data": {
"id": 12,
"url": "https://bayi.com/.../webhook.php",
"event_types": ["service.*", "credit.added"],
"secret": "whsec_...TEK_SEFER...",
"is_active": true
},
"meta": { "trace_id": "...", "timestamp": "..." }
}

URL Kuralları (SSRF Koruması)

  • https:// zorunludur.
  • URL'de user:pass@ bulunamaz.
  • DNS çözümlenen tüm IP'ler public olmalıdır (özel/dahili IP'ler reddedilir).

2. Abonelik Pattern'leri

event_types dizisi şu biçimleri destekler:

PatternAnlamı
*Tüm olaylar (catch-all)
service.*Namespace wildcard — service ile başlayan tüm olaylar
service.createdTam olay adı (exact)

Geçerli namespace'ler: service, product, credit. Geçersiz bir pattern gönderirseniz kayıt 422 ile reddedilir (sessizce "hiç olay almama" yerine net hata).

3. Olay Kataloğu

OlayNe zamanPayload alanları (özet)
service.createdVPS provizyonu tamamlandı (aktif)provision_id, service_id, order_id, product_id, status
service.suspendedServis askıya alındıservice_id, reason
service.unsuspendedAskı kaldırıldıservice_id
service.terminatedServis iptal edildiservice_id
product.price_changedÜrün fiyatı değişti (bildirim)product_id
product.stock_changedÜrün stok durumu değiştiproduct_id, stock_active
product.disabledÜrün satışa kapatıldıproduct_id
credit.addedBayi kredisi eklendi (iade/manuel)reseller_id, amount, currency, reason, new_balance

Not: product.* olayları yalnızca bildirim taşır. Güncel veriyi GET /products/{id} ile çekin (hibrit notification + pull).

Her payload'ın kökünde schema_version alanı bulunur (şu an 1).

4. İmza Doğrulama (KRİTİK)

Her istekte X-Rabisu-Signature başlığı gönderilir. İmza, ham (raw) istek gövdesinin HMAC-SHA256'sıdır:

X-Rabisu-Signature: sha256=<hmac_sha256(raw_body, secret)>

Doğrulama (PHP):

$raw = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $raw, $webhookSecret);
$received = $_SERVER['HTTP_X_RABISU_SIGNATURE'] ?? '';

if (!hash_equals($expected, $received)) {
http_response_code(401); // Geçersiz imza
exit;
}
// Güvenli: payload işlenebilir
$payload = json_decode($raw, true);
  • İmzayı her zaman doğrulayın — yoksa sahte istekler kabul edersiniz.
  • Karşılaştırmada hash_equals gibi sabit zamanlı fonksiyon kullanın.
  • Gövdeyi JSON'a çevirmeden önce ham hali üzerinden doğrulayın (yeniden serialize edilen JSON imzayı bozar).

5. Teslim ve Yanıt Sözleşmesi

Endpoint'iniz aşağıdaki HTTP kodlarını döndürmelidir:

YanıtAnlamıRabisu davranışı
2xxBaşarıyla işlendiTeslim tamam
4xx (401 dahil)Kalıcı hata (imza/format)Tekrar denenmez
5xxGeçici hataÜstel backoff ile tekrar denenir

Yeniden deneme takvimi: 1dk → 5dk → 15dk → 1s → 6s → 24s. 6 denemeden sonra olay "dead letter" olarak işaretlenir. Art arda 5 başarısızlıkta endpoint otomatik pasifleştirilir (circuit breaker) — düzeltince PATCH /webhooks/{id} ile yeniden aktifleştirin.

6. Yönetim Uç Noktaları

  • GET /webhooks — kayıtlı endpoint'leri listele (pasif dahil)
  • GET /webhooks/{id} — detay
  • PATCH /webhooks/{id} — yeniden aktifleştir / event_types veya description güncelle
  • DELETE /webhooks/{id} — sil (soft delete)