WhatsApp Webhook Mesajları Gelmiyor Sorunu ve Kesin Çözümü (Meta API)

WhatsApp Business API entegrasyonu yaparken en sık karşılaşılan ve en sinir bozucu sorunlardan biri: **Webhook kurulumunu yaptınız, testler başarılı, test butonu çalışıyor ama gerçek WhatsApp mesajları sunucunuza bir türlü düşmüyor!**

Bugün yaşadığımız bu sorunu ve Meta Developer Console arayüzüne güvenmeyip API ile nasıl kesin çözüme ulaştığımızı adım adım anlatıyorum.

## Belirtiler

1. Sunucunuz çalışıyor (`GET /` ve `GET /webhook` isteklerine yanıt veriyor).
2. Meta Developer Console > Webhooks bölümündeki **”Test”** butonu ile gönderdiğiniz sahte veriler sunucunuza başarıyla ulaşıyor.
3. Ancak kendi telefonunuzdan veya başka bir numaradan işletme hesabınıza (Test Numarası dahil) mesaj attığınızda sunucuda hiçbir hareket (Logs) olmuyor.

## Neden Oluyor?

Sorunun temel kaynağı **Abonelik (Subscription)** kopukluğu.

Meta Developer Console arayüzündeki “Subscribe” butonuna bastığınızda, teorik olarak uygulamanızın `messages` (mesajlar) olayını dinlemesi gerekir. Ancak bazen bu işlem sadece **Uygulama (App)** seviyesinde kalır.

Arka planda **WhatsApp Business Hesabı (WABA)** ile **Uygulamanız** arasındaki bağlantı (“link”) tam olarak kurulamaz. Sonuç olarak: Uygulama dinlemeye hazırdır ama Business Hesabı ona veriyi göndermez.

## Çözüm: API ile Manuel Abonelik (Force Subscribe)

Arayüzdeki butonlar işe yaramadığında, Meta Graph API’yi kullanarak bu bağlantıyı manuel olarak kurabiliriz. Bu işlem “el sıkışmayı” zorunlu kılar.

### Gereksinimler

* **WABA ID (WhatsApp Business Account ID):** Meta panelinde işletme hesabınızın ID’si.
* **System User Access Token:** Tam yetkili (admin) erişim jetonunuz.

### Adım Adım Uygulama

Terminalinizi açın ve aşağıdaki `curl` komutunu kendi bilgilerinizle düzenleyerek çalıştırın:

“`bash
curl -X POST “https://graph.facebook.com/v22.0/{WABA_ID}/subscribed_apps” \
-H “Authorization: Bearer {ACCESS_TOKEN}” \
-H “Content-Type: application/json” \
-d ‘{
“subscribed_fields”: [“messages”, “message_template_status_update”, “messages_preview”]
}’
“`

*(Not: `v22.0` yerine güncel API versiyonunu yazabilirsiniz, ancak eski versiyonlar da genellikle çalışır.)*

### Beklenen Sonuç

Komutu çalıştırdığınızda şu yanıtı almalısınız:

“`json
{
“success”: true
}
“`

Bu `true` yanıtını aldıktan sonra telefonunuzdan tekrar mesaj gönderin. %99 ihtimalle webhook’unuz artık tetiklenecektir! 🚀

## Kontrol Etmek İsterseniz (GET)

Aboneliğin gerçekten olup olmadığını kontrol etmek için şu komutu kullanabilirsiniz:

“`bash
curl -X GET “https://graph.facebook.com/v22.0/{WABA_ID}/subscribed_apps” \
-H “Authorization: Bearer {ACCESS_TOKEN}”
“`

Eğer çözümden önce bu komutu çalıştırırsanız listenin boş olduğunu veya alakasız uygulamaların olduğunu göreceksiniz. Çözümden sonra ise kendi uygulamanızın adını ve ID’sini göreceksiniz.

**Özet:** Meta arayüzü bazen yanıltıcı olabilir. Webhook yapılandırmasında her şey doğru görünmesine rağmen veri akmıyorsa, `subscribed_apps` API endpoint’i hayat kurtarır.

# Kalıcı Access Token (System User) Nasıl Alınır?
WhatsApp API projelerinde kullanılan geçici tokenlar (24 saatlik) sürekli değiştiği için production (canlı) ortamında kullanılmaz. Bunun yerine **asla süresi dolmayan** bir token almalıyız.
Bunun için **Meta Business Settings** üzerinde bir “Sistem Kullanıcısı” oluşturacağız.
## 1. Business Ayarlarına Gidin
1. [business.facebook.com/settings](https://business.facebook.com/settings) adresine gidin.
2. Doğru işletme hesabınızı seçtiğinizden emin olun.
## 2. Sistem Kullanıcısı Oluşturun
1. Sol menüden **Users (Kullanıcılar)** > **System Users (Sistem Kullanıcıları)** seçeneğine tıklayın.
2. **Add (Ekle)** butonuna basın.
3. Bir isim verin (Örn: `WhatsappBotAdmin`).
4. Rol olarak **”Admin”** seçin.
5. Kullanıcıyı oluşturun.
## 3. Varlık (Asset) Atama
Oluşturduğunuz kullanıcıya WhatsApp uygulamanızı yetkilendirmelisiniz.
1. Yeni oluşturduğunuz kullanıcının üzerine tıklayın.
2. **”Add Assets” (Varlık Ekle)** butonuna basın.
3. **Apps (Uygulamalar)** sekmesine gelin.
4. Projenizdeki WhatsApp uygulamasını (`CafeSiparisTest` vs.) seçin.
5. **”Full Control” (Tam Kontrol)** yetkisini açın.
6. Kaydedin.
## 4. Token Oluşturma (Kritik Adım)
1. Yine aynı kullanıcı ekranında **”Generate New Token” (Yeni Token Oluştur)** butonuna basın.
2. Açılan pencerede uygulamanızı seçin.
3. **Token Expiration:** Asla sonlanmasın (Never) veya en uzun süreyi seçin.
4. **Permissions (İzinler) Listesi:**
Şu iki izni mutlaka seçmelisiniz:
*`whatsapp_business_management`
*`whatsapp_business_messaging`
5. **Generate Token** butonuna basın.
## 5. Token’ı Kaydetme
Ekranda çok uzun bir Access Token belirecek.
📢 **Bu token’ı kopyalayın ve güvenli bir yere kaydedin.** Bu token bir daha gösterilmez!
## 6. Projeye Ekleme
Aldığınız bu kalıcı token’ı projenizdeki `.env` dosyasına (veya Coolify Env Variables’a) ekleyin:
“`bash
TOKEN=EAARLL… (Kalıcı TokenBuraya Gelecek)
“`
Artık token süresi doldu hatası almayacaksınız! 🚀

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir