Entegrasyon

Webhooks

Olayları kendi sunucuna al — abonelik, imza doğrulama, yeniden deneme ve olay kataloğu.

Webhook, bir şey olduğunda Blesyum'un senin sunucuna POST atmasıdır. Sürekli sorgulamak (polling) yerine olayı beklersin.

Abonelik

Panel → Geliştirici → Webhooks → Yeni uç

İki şey verirsin: adres ve dinlemek istediğin olaylar. Karşılığında bir imza sırrı alırsın (whsec_ önekli) — bu bir kez gösterilir.

Olay adı katalogdan doğrulanır. Yanlış yazılmış bir ad (conversation.creted) artık 400 alır. Eskiden 201 dönüyor, abonelik kuruluyor ve hiçbir teslimat gelmiyordu — hata günler sonra "webhook'um çalışmıyor" olarak görünüyordu.

Katalog lisansına göre daralır: aboneliğinde olmayan bir modülün olayı listede görünmez. Seçilebilen ama asla gelmeyecek bir olay, sessizce kaçırılan bir olaydır.

Teslimat isteği

http
POST /senin-ucun HTTP/1.1
Content-Type: application/json
X-Blesyum-Event: conversation.created
X-Blesyum-Delivery: 0193c4e2-…
X-Blesyum-Signature: 5f3a9c…
BaşlıkNe taşır
X-Blesyum-EventOlay tipi
X-Blesyum-DeliveryTeslimat kimliği — mükerrer tespiti için
X-Blesyum-SignatureHex HMAC-SHA256(sır, ham gövde)

İmzayı DOĞRULA

Bu adım isteğe bağlı değildir: adresini bilen herkes sana istek atabilir.

ts
import { createHmac, timingSafeEqual } from "node:crypto";

export function imzaGecerli(hamGovde: string, imza: string, sir: string): boolean {
  const beklenen = createHmac("sha256", sir).update(hamGovde).digest("hex");
  const a = Buffer.from(beklenen, "utf8");
  const b = Buffer.from(imza, "utf8");
  // Uzunluk farklıysa timingSafeEqual FIRLATIR; önce uzunluğu karşılaştır.
  if (a.length !== b.length) return false;
  // 🔴 Düz `===` KULLANMA: karşılaştırma süresi eşleşen karakter sayısına göre
  //    değişir ve saldırgan imzayı bayt bayt tahmin edebilir.
  return timingSafeEqual(a, b);
}
python
import hmac, hashlib

def imza_gecerli(ham_govde: bytes, imza: str, sir: str) -> bool:
    beklenen = hmac.new(sir.encode(), ham_govde, hashlib.sha256).hexdigest()
    return hmac.compare_digest(beklenen, imza)

İmza ham gövde üzerinden hesaplanır. JSON'u ayrıştırıp yeniden serileştirirsen boşluklar ve anahtar sırası değişir, imza tutmaz. Gövdeyi önce bayt olarak al, imzayı doğrula, sonra ayrıştır.

Yanıtın önemli

  • 2xx dön — teslimat başarılı sayılır.
  • Hızlı dön. İşi kuyruğa at, 200 dön; uzun süren bir işlem zaman aşımına düşer ve olay yeniden denenir.
  • 2xx dışı her şey başarısızlıktır ve yeniden denenir.

Üst üste başarısız olan bir uç geçici olarak devre dışı bırakılır; panelde neden başarısız olduğunu (durum kodu ve hata metni) görürsün.

Mükerrer teslimat

Ağ belirsizdir: 200 döndürdüğün bir olay yeniden gelebilir. X-Blesyum-Delivery kimliğini sakla ve daha önce gördüğünü yok say. Bu, en-az-bir-kez teslimat modelinin doğal sonucudur ve senin tarafında çözülür.

Test ortamı

test ortamındaki bir API anahtarı canlı yan etkileri tetiklemez: webhook teslimatı yapılmaz. Entegrasyonunu gerçek veriyle ama sessizce deneyebilirsin.

Olaylar

Katalog panelde ve GET /api/v1/webhooks/catalog ucunda. CRM olaylarından bazıları:

OlayNe zaman
conversation.createdYeni görüşme açıldı (widget · e-posta · panel · API — hepsi)
conversation.repliedGörüşmeye yanıt geldi
conversation.closedGörüşme kapatıldı
conversation.snoozedGörüşme ertelendi
contact.created · contact.updated · contact.deletedKişi kaydı

Olay duyurusu, kaydı yazan ortak kapının içinde ve aynı veritabanı işleminde üretilir. Yani bir görüşme hangi yoldan açılırsa açılsın (canlı sohbet, gelen e-posta, panel, API) olay gider — kapının bir dalı unutulmuş olamaz.