İçeriğe geç
OmniChannels.ai

WhatsApp Webhook Rehberi: Olaylar, Güvenlik ve Yeniden Denemeler

WhatsApp webhook'ları nasıl çalışır: mesaj ve durum olayları, güvenilir işleyici, Meta imza kontrolü, yeniden denemeler, idempotency ve kayıp olayları kurtarma.

Güncelleme 10 dk okuma

Yazar: OmniChannels.ai Editorial Team · İnceleyen: BroadNet Messaging Solutions Team

Entegrasyon

Kısa yanıt

WhatsApp webhook'u, sunucunuzda olayları alan bir HTTPS uç noktasıdır: gönderdiğiniz mesajların iletim durumları ve müşterilerin size gönderdiği mesajlar. OmniChannels.ai ile durumlar SUBMITTED, SENT, DELIVERED, READ, FAILED veya REJECTED olarak gelir. Ham gövdeyi saklayın, hızla 2xx yanıtlayın, mesaj kimliğine göre mükerrerleri ayıklayın ve asenkron işleyin. Meta kendi webhook'larını imzalar; belgelerimiz bir imza başlığı tanımlamaz, bu yüzden uç noktanızı aktarım ve uygulama düzeyinde güvenceye alın.

Bu sayfada
  1. WhatsApp webhook'ları nedir ve neden kullanılır?
  2. Hangi olayları ve durumları alırım?
  3. Uç noktayı nasıl kurarım?
  4. Yük nasıl görünür?
  5. Güvenilir bir işleyici nasıl yazarım?
  6. WhatsApp webhook'unu nasıl güvenceye alırım?
  7. İletim başarısız olduğunda ne olur?
  8. Kayıp olayları nasıl kurtarırım?
  9. Örnek senaryo: Bir perakendecinin bildirim hattı
  10. Yaygın hatalar nelerdir?
  11. OmniChannels.ai nasıl yardımcı olur?

Öne çıkan noktalar

  • Webhook'lar durumları ve gelen mesajları polling yapmanız gerekmeden HTTPS uç noktanıza iter; WhatsApp durumları SUBMITTED, SENT, DELIVERED, READ, FAILED ve REJECTED olarak normalleştirilir.
  • Güvenilir bir işleyici üç şeyi sırasıyla yapar: ham olayı saklar, 2xx döndürür, ardından asenkron ve idempotent olarak işler.
  • Durumlar sırasız veya iki kez gelebilir; bu yüzden onları sıralayın ve geç gelen bir SENT'in saklanmış bir DELIVERED'ın üzerine yazmasına asla izin vermeyin.
  • Meta, uygulamalara gönderdiği webhook'ları X-Hub-Signature-256 başlığıyla imzalar; ancak OmniChannels.ai API belirtimi bir webhook imzası tanımlamaz, bu yüzden HTTPS, tahmin edilemez bir yol ve gövde doğrulaması kullanın.
  • Olaylar kaçırıldıysa mesajları yeniden göndermek yerine WhatsApp durumunu bulk-insights uç noktasından batch bazında okuyun.

Bu rehber, WhatsApp olaylarını güvenilir biçimde almak zorunda olan mühendisler için hazırlandı: gönderdikleri mesajların iletim durumları ve müşterilerden gelen mesajlar. Webhook'ların nasıl çalıştığını, işleyicide neyin kurulacağını, güvenliğin Meta'nın webhook'ları ile bizimkiler arasında nasıl farklılaştığını ve olaylar kaybolduğunda ne yapılacağını açıklar.

WhatsApp webhook'ları nedir ve neden kullanılır?

WhatsApp webhook'ları HTTP geri çağrılarıdır. Bir mesajın durumu değiştiğinde ya da bir müşteri size yazdığında platform, uç noktanıza JSON gövdeli bir POST gönderir. Polling yapmanız gerekmez ve olayları gerçekleştikçe görürsünüz.

İki olay ailesi önemlidir:

  • Gönderdiğiniz mesajlar için durum olayları: kuyruğa alındı, gönderildi, iletildi, okundu, başarısız.
  • 24 saatlik müşteri hizmetleri penceresini açan veya uzatan, müşterilerden gelen mesajlar. Pencere rehberimize bakın.

Bir gönderim çağrısı yalnızca mesajların kuyruğa alındığını söyler. Her alıcıya ne olduğunu webhook'tan öğrenirsiniz.

Hangi olayları ve durumları alırım?

OmniChannels.ai'de her kanal aynı normalleştirilmiş durumları bildirir; böylece tek bir işleyici WhatsApp'a, SMS'e ve diğerlerine hizmet verebilir.

Durum Anlamı Nihai mi?
SUBMITTED Platform tarafından kabul edildi ve kuyruğa alındı Hayır
SENT Kanala devredildi Hayır
DELIVERED Alıcının cihazında teyit edildi Genellikle; READ takip edebilir
READ Kanalın okuma bildirdiği yerlerde alıcı tarafından açıldı Evet
FAILED İletilmedi; olay mümkün olduğunda bir neden taşır Evet
REJECTED Engellenen içerik veya kayıtsız gönderici gibi nedenlerle reddedildi Evet

Durumları sırasız gelebilecek bir ilerleme olarak ele alın ve zaman içinde yeni değerler bekleyin. Tanımadığınız bir durumda hata vermeyin. Mesaj iletim durumları açıklaması yazısına bakın.

Uç noktayı nasıl kurarım?

Bir HTTPS uç noktası açın, URL'yi sağlayıcınıza verin, ardından kendi numaranızla test edin.

  1. JSON gövdeli POST kabul eden bir uç nokta oluşturun; örneğin https://api.example.com/webhooks/omnichannels.
  2. URL'yi hesabınızda yapılandırması için ekibimize veya hesap yöneticinize gönderin. Bayiler alt hesap başına ayrı bir webhook alabilir.
  3. Kendi numaranıza bir test mesajı gönderin ve olayların geldiğini teyit edin.

Geliştirme sırasında ngrok gibi bir tünel yerel sunucunuza herkese açık bir HTTPS URL'si verir. Bir uygulamayı ayrıca doğrudan Meta'ya bağlarsanız Meta'nın uç nokta doğrulaması ayrı bir adımdır: bir doğrulama token'ı ve hub.challenge değeri taşıyan bir GET isteği; Meta'nın webhook uç noktası belgelerinde anlatıldığı gibi buna challenge ile 200 yanıtı verirsiniz.

Yük nasıl görünür?

Kanala göre değişir. API belirtimi tek bir webhook şeması tanımlamaz; bu yüzden önce ham gövdeyi günlüğe alın ve ihtiyacınız olan alanları hesabınızdaki gerçek olaylardan eşleyin. Örnek, bir iletim olayının taşıdığı bilgi türünü gösterir ve yalnızca açıklayıcıdır.

{
  "messageId": "2603121407537573731",
  "channel": "SMS",
  "destination": "447700900123",
  "status": "DELIVERED",
  "timestamp": "2026-10-10T09:15:42Z",
  "reason": null
}

Gerçek bir olayı kontrol etmeden bu alan adlarına karşı kod yazmayın. Devreye alma mühendisinizden kanal başına örnek yükler isteyin ve bunları test verisi olarak saklayın. Daha geniş belgeler için webhook referansına bakın.

Güvenilir bir işleyici nasıl yazarım?

Üç şeyi sırasıyla yapın: ham olayı saklayın, 2xx ile onaylayın, ardından asenkron işleyin. Aşağıdaki işleyici belgelerimizdeki deseni izler.

import express from "express";

const app = express();

// Ham gövdeyi, alındığı haliyle saklayabilmek için yakalayın.
app.post(
  "/webhooks/omnichannels",
  express.json({ verify: (req, _res, buf) => { req.rawBody = buf.toString("utf8"); } }),
  async (req, res) => {
    try {
      await db.webhookEvents.insert({ receivedAt: new Date(), body: req.rawBody });
    } catch (err) {
      return res.sendStatus(500); // depolama başarısız: olayın yeniden denenmesine izin verin
    }
    res.sendStatus(200);          // hızla onaylayın
    queue.publish("status-events", req.body); // asıl işi başka yerde yapın
  },
);

// Worker: idempotent işleme
async function processEvent(event) {
  const id = event.messageId ?? event.message_id ?? event.id; // kanala göre eşleyin
  const status = event.status;
  const rank = { SUBMITTED: 1, SENT: 2, DELIVERED: 3, READ: 4, FAILED: 4, REJECTED: 4 };

  const current = await db.messages.findOne({ providerId: id });
  if (!current) return; // bilinmeyen mesaj: günlüğe alın ve inceleyin
  if ((rank[status] ?? 0) <= (rank[current.status] ?? 0)) return; // mükerrer veya eski

  await db.messages.update({ providerId: id }, { status, updatedAt: new Date() });
}
from datetime import datetime, timezone
from flask import Flask, request

app = Flask(__name__)

RANK = {"SUBMITTED": 1, "SENT": 2, "DELIVERED": 3, "READ": 4, "FAILED": 4, "REJECTED": 4}


@app.post("/webhooks/omnichannels")
def omnichannels_webhook():
    raw = request.get_data(as_text=True)
    try:
        db.webhook_events.insert({"received_at": datetime.now(timezone.utc), "body": raw})
    except Exception:
        return "", 500           # depolama başarısız: olayın yeniden denenmesine izin verin
    queue.publish("status-events", raw)  # asenkron işleyin
    return "", 200               # hızla onaylayın

db ve queue nesneleri sizin kendi depolamanız ve iş kuyruğunuzdur. rank eşlemesi işlemeyi idempotent yapan şeydir: mükerrer veya eski bir olay ilerleme değildir, bu yüzden yok sayılır.

Güvenilir bir işleyici için kurallar

  • Birkaç saniye içinde yanıt verin. Yanıt vermeden önce ağır iş yapmayın.
  • 2xx değerini yalnızca olay saklandıktan sonra döndürün. Depolama başarısız olursa 5xx döndürün.
  • Mesaj kimliğine göre mükerrerleri ayıklayın. Aynı durum birden fazla kez gelebilir.
  • Bir mesajı asla işleyiciden yeniden göndermeyin. Yeniden denemelere, durumu kontrol ettikten sonra ayrı bir işte karar verin.
  • Ham gövdeyi saklayın; sorun giderme ve bir düzeltmeden sonra olayları tekrar oynatmak için.

WhatsApp webhook'unu nasıl güvenceye alırım?

Uç noktanıza kimin gönderdiğine bağlıdır. Meta, Meta'ya kaydettiğiniz uygulamalara gönderdiği webhook'ları imzalar. OmniChannels.ai API belirtimi bir webhook imza başlığı tanımlamaz; bu yüzden birini beklemeyin.

Meta'dan kendi uygulamanıza OmniChannels.ai'den uç noktanıza
İmza Meta'nın belgelerine göre X-Hub-Signature-256 başlığı API belirtiminde tanımlı değil
Doğrulama Ham yükün uygulama gizli anahtarınızla HMAC-SHA256'sı, başlıkla karşılaştırılır Geçerli değil
Kontrolleriniz Her POST'ta imzayı kontrol edin Geçerli sertifikalı HTTPS, tahmin edilemez bir yol, katı gövde doğrulaması

Meta'nın şeması için Meta'nın belgeleri, uygulama gizli anahtarınızı kullanarak JSON yükünden bir HMAC-SHA256 özeti üretmeyi ve X-Hub-Signature-256 başlığındaki sha256= sonrasındaki değerle karşılaştırmayı söyler. HMAC'in kendisi RFC 2104'te tanımlıdır. Yeniden serileştirilmiş bir nesne üzerinden değil ham baytlar üzerinden hesaplayın ve sabit zamanlı karşılaştırın.

Bizim uç noktamız için:

  • Yalnızca geçerli bir sertifikayla HTTPS kullanın.
  • Uzun, tahmin edilemez bir yol kullanın ve sızarsa değiştirin.
  • Gövde şeklini doğrulayın ve beklenmeyen her şeyi reddedin.
  • Olayları bildirim olarak ele alın. Geri ödeme veya dolandırıcılık kilidi gibi geri alınamaz bir eylemden önce durumu bir polling çağrısıyla teyit edin.

İletim başarısız olduğunda ne olur?

Yeniden denemeler göndericiye bağlıdır. Meta'nın belgeleri, başarısız bir iletimi azalan sıklıkla 7 güne kadar yeniden denediğini söyler; bu mükerrer bildirimlere yol açabilir. Mükerrerleri nadiren görseniz bile idempotent olmanın nedeni budur. Platformumuzdan gelen olaylar için, Meta'nınkiyle eşleştiğini varsaymak yerine yeniden deneme davranışını devreye alma mühendisinizle teyit edin.

Her iki durumda da kaybı da mükerrer kadar hesaba katın: uç noktanız bir dağıtım sırasında kapalı olabilir ve bir güvenlik duvarı kuralı istekleri sessizce düşürebilir.

Kayıp olayları nasıl kurtarırım?

Mesajı yeniden göndermeyin, batch'i sorgulayın.

İhtiyaç Çağrı Notlar
Alıcı bazlı WhatsApp durumunu okuma GET /whatsapp/message/bulk-insights Bir batch'i status veya destination ile filtreleyin; page ve size ile sayfalanır
SMS iletim raporlarını yeniden itme POST /sms/resendDlr startDate, endDate, senderId ve messageStatus ile filtreleyin
curl "https://api.broadnet.me/whatsapp/message/bulk-insights?batch_Id=2609091405000000001&page=0&size=100" \
  -H "Authorization: Bearer $BROADNET_TOKEN"

batch_Id, gönderim çağrısının döndürdüğü kimliktir ve page sıfırdan başlar. Önceki günün batch'lerini okuyan ve boşlukları dolduran gecelik bir mutabakat çalıştırın.

Sorun giderme kontrol listesi

  1. URL doğru hesapta veya alt hesapta mı yapılandırılmış?
  2. Uç noktaya geçerli sertifikayla HTTPS üzerinden ulaşılabiliyor mu?
  3. Hızla 2xx yanıtlıyor mu, yoksa zaman aşımına mı uğruyor?
  4. Bir güvenlik duvarı veya WAF kuralı istekleri engelliyor mu?
  5. Ayrıştırmadan önce ham gövdeyi günlüğe alıyor musunuz; böylece bir ayrıştırıcı hatası olayı gizleyemesin?

Örnek senaryo: Bir perakendecinin bildirim hattı

BAE'li bir perakendeci olan "Souq Rafiq" (kurgusal), sipariş güncellemelerini WhatsApp ile gönderiyor ve sipariş aracında doğru durum istiyor.

  1. Siparişler sendbulk ile gönderilir ve batchId siparişte saklanır. Bkz. API ile WhatsApp mesajı gönderme.
  2. Webhook uç noktası her olayı bir tabloya yazar, ardından 200 döndürür.
  3. Bir worker durumları sıralar ve siparişin mesaj durumunu günceller.
  4. FAILED olayları, nedeniyle birlikte destek için bir görev oluşturur ve kanal fallback uyarınca bir SMS fallback'i değerlendirilir.
  5. Gelen müşteri mesajları, temsilciler pencere içinde yanıtlayabilsin diye ortak gelen kutusuna yönlendirilir.
  6. Gecelik bir iş, dünkü batch'ler için bulk-insights'ı çağırır ve kaçırılanları düzeltir.

Yaygın hatalar nelerdir?

  • Yanıt vermeden önce ağır iş; bu zaman aşımlarına ve tekrarlanan iletimlere yol açar.
  • Saklamadan önce onaylamak; depolama başarısız olduğunda olayları kaybettirir.
  • Sıraya güvenmek. Geç gelen bir SENT'in DELIVERED'ın üzerine yazması.
  • Gerçek olaylar yerine açıklayıcı yüke karşı kod yazmak.
  • İmzayı kontrol etmeden önce JSON'u yeniden serileştirmek; bu baytları değiştirir.
  • İşleyiciden yeniden göndermek; bu döngüye girebilir.
  • Limitler: bu rehber belgelenmiş davranışımızı anlatır. Hesabınız için yeniden deneme politikası ve yük alanları devreye alma sırasında teyit edilmelidir.

OmniChannels.ai nasıl yardımcı olur?

OmniChannels.ai, WhatsApp, SMS, RCS ve diğer kanallar için iletim durumlarını ve gelen mesajları tek bir normalleştirilmiş biçimde webhook'unuza iter; bayiler için alt hesap başına ayrı webhook'lar vardır. BroadNet resmi bir Meta Business Solution Provider'dır; bu yüzden Meta'nın kendi webhook gereksinimleri sizin yerinize karşılanır ve siz bizim API'mizle çalışırsınız. Webhook referansını ve WhatsApp API belgelerini okuyun veya olayların ortak gelen kutusunda nasıl göründüğüne bakın.

Sık sorulan sorular

WhatsApp webhook nedir?

WhatsApp webhook'u, bir mesaj iletildiğinde, okunduğunda veya başarısız olduğunda ya da bir müşteri size mesaj gönderdiğinde platformun bir HTTP POST ile çağırdığı, sunucunuzdaki bir URL'dir. Polling'in yerini alır. Bir HTTPS uç noktası açar, sağlayıcınızla paylaşır ve aldığı JSON olaylarını işlersiniz.

WhatsApp webhook imzasını nasıl doğrularım?

Meta'nın doğrudan kendi uygulamanıza gönderdiği bir webhook için Meta'nın belgeleri, ham yükün uygulama gizli anahtarınızla HMAC-SHA256'sını hesaplayıp X-Hub-Signature-256 başlığıyla karşılaştırmayı söyler. OmniChannels.ai webhook'unda API belirtimi bir imza başlığı tanımlamaz; bu yüzden HTTPS'e, tahmin edilemez bir yola ve gövde doğrulamasına güvenin.

Webhook uç noktam kapalıysa ne olur?

Meta'nın belgeleri, başarısız iletimleri azalan sıklıkla 7 güne kadar yeniden denediğini söyler; bu mükerrerlere yol açabilir. Platformumuzdan gelen olaylar için yeniden deneme davranışını devreye alma mühendisinizle teyit edin ve bir batch için alıcı bazlı WhatsApp durumunu okumak üzere bulk-insights uç noktasını kullanın. SMS için resendDlr uç noktası raporları yeniden iter.

Mükerrer webhook olaylarını nasıl yönetirim?

İşlemeyi idempotent yapın. Mesajı kimliğiyle sorgulayın, gelen durumun sırasını saklanmış olanla karşılaştırın ve ilerleme olmayan olayları yok sayın. Aynı olayı iki kez uygulamak bir kez uygulamakla aynı etkiye sahip olmalıdır. Bir hatayı düzelttikten sonra tekrar oynatabilmek için her olayın ham gövdesini saklayın.

Uç noktam ne kadar hızlı yanıt vermeli?

Birkaç saniye içinde. Ham olayı saklayın, 2xx döndürün ve asıl işi bir kuyrukta veya worker'da yapın. Yanıt vermeden önce başka servisleri çağırmayın, mesaj göndermeyin veya ağır sorgular çalıştırmayın. Depolama başarısız olursa, kaybettiğiniz bir olayı onaylamak yerine göndericinin yeniden deneyebilmesi için 5xx döndürün.

Otomatik yanıt göndermek için webhook kullanabilir miyim?

Evet, ancak işleyicinin içinden değil. Olayı onaylayın, sonra yanıta ayrı bir işte karar verin. 24 saatlik müşteri hizmetleri penceresi içinde serbest biçimli mesaj gönderebilirsiniz; dışında onaylı bir şablon gerekir. Döngüleri ve mükerrerleri önlemek için bir mesajı asla webhook işleyicisinin kendisinden yeniden göndermeyin.

Kaynaklar

  1. Webhook'lara genel bakış — WhatsApp Business Platform, Meta for Developers
  2. Webhook uç noktası oluşturma — WhatsApp Business Platform, Meta for Developers
  3. RFC 2104: HMAC: Mesaj Kimlik Doğrulaması için Anahtarlı Özetleme