Giriş yapınÜcretsiz denemeyi başlatın
Meta Tech Provider

PHP ve Laravel ile WhatsApp mesajı gönderin ve alın

Mesaj almak, Meta'nın doğrulama GET isteğini yanıtlayan ve POST'ları kabul eden bir Laravel rotasıdır; PHP noktaları alt çizgiye çevirdiği için parametreler hub_mode, hub_verify_token ve hub_challenge olarak okunur. Göndermek, numaranın phone number id'si ve token'ı ile Cloud API mesajlar uç noktasına tek bir Http::withToken() POST isteğidir. SDK gerekmez.

hub_challenge

PHP, gelen değişken adlarındaki noktaları alt çizgiye çevirir; bu yüzden hub.challenge, hub_challenge olarak okunur.

routes/api.php

install:api ile oluşturulan Laravel'in durumsuz API rotaları /api altında sunulur ve web grubunun CSRF korumasının dışında kalır.

v25.0

Meta'nın güncel mesaj gönderme örneklerindeki Graph API sürümü, POST /{phone-number-id}/messages üzerinde kullanılır.

Laravel'de WhatsApp mesajları nasıl alınır?

routes/api.php içinde aynı yola bir GET ve bir POST tanımlayarak. Dosya yoksa önce php artisan install:api çalıştırın. API rotaları durumsuz çalışır ve web grubunun dışındadır; bu yüzden Meta'nın POST'u, routes/web.php içindeki bir rotada olduğu gibi eksik CSRF token'ı yüzünden reddedilmez.

GET, Meta'nın doğrulamasını yanıtlar. Meta hub.mode, hub.verify_token ve hub.challenge gönderir, ancak PHP gelen değişken adlarındaki noktaları alt çizgiye çevirir; Laravel de hub_mode, hub_verify_token ve hub_challenge görür. Noktalı adları okuyan kod null alır ve asla doğrulanmaz. Challenge değerini response()->json() ile değil, düz metin olarak döndürün.

POST, payload'u kuyruğa alınan bir işe verir ve hemen 200 döndürür. Yola uzun, rastgele bir anahtar koyun ve her iki rotada da kontrol edin: Meta teslimatları Tech Provider'ın uygulama sırrıyla imzalar, bu yüzden imza başlığını sizin tarafınızda doğrulamak mümkün değildir.

routes/api.php: verification and event intake
use App\Jobs\HandleWhatsAppEvent;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/whatsapp/{key}', function (Request $request, string $key) {
    abort_unless(hash_equals(config('services.whatsapp.url_key'), $key), 404);

    // PHP turns hub.mode into hub_mode: read the underscored names
    if ($request->query('hub_mode') === 'subscribe'
        && hash_equals(config('services.whatsapp.verify_token'),
                       (string) $request->query('hub_verify_token'))) {
        return response((string) $request->query('hub_challenge'), 200)
            ->header('Content-Type', 'text/plain');
    }

    abort(403);
});

Route::post('/whatsapp/{key}', function (Request $request, string $key) {
    abort_unless(hash_equals(config('services.whatsapp.url_key'), $key), 404);

    HandleWhatsAppEvent::dispatch($request->json()->all());

    return response('', 200);
});

Laravel'den WhatsApp mesajı nasıl gönderilir?

Laravel'in HTTP istemcisiyle: phone number id için mesajlar uç noktasına tek bir POST, erişim token'ı da bearer token olarak. Her iki değer de bağlantıdan gelir; panelde gösterilir ve get_api_credentials ile döner. Koda yazmak yerine, ortam değişkenlerine bağlı config/services.php içinde tutulmalıdır.

Gövdenin yapısı zamanlamaya bağlıdır. Müşterinin son mesajından sonraki 24 saat içinde aşağıdaki gibi bir metin nesnesi çalışır. Bu pencerenin dışında Meta yalnızca onaylı bir şablonu ve dilini belirten bir şablon nesnesini kabul eder; serbest metin 131047 kodlu hatayla başarısız olur. Bunu görmek için yanıta bakın: başarısız bir çağrı, code alanı neyin ters gittiğini söyleyen bir hata nesnesi döndürür, bu yüzden onu atmayın, loglayın.

İstekte EasyCoexistence'a özgü hiçbir şey yoktur. Bu, Meta'nın kendi dokümantasyonundaki çağrıdır; bu yüzden herhangi bir PHP HTTP istemcisi, Guzzle veya düz cURL aynı şekilde çalışır.

Send a text reply inside the 24 hour window
use Illuminate\Support\Facades\Http;

$response = Http::withToken(config('services.whatsapp.token'))
    ->post('https://graph.facebook.com/v25.0/'
        . config('services.whatsapp.phone_number_id') . '/messages', [
        'messaging_product' => 'whatsapp',
        'to' => '14155550188', // digits only, with country code
        'type' => 'text',
        'text' => ['body' => 'Thanks, we are on it.'],
    ]);

if ($response->failed()) {
    // error.code 131047: outside the window, send a template instead
    logger()->warning('WhatsApp send failed', $response->json('error', []));
}

Üretimdeki bir Laravel işleyicisi bunun ötesinde neye ihtiyaç duyar?

Gerçek bir kuyruğa, tekilleştirmeye ve pencere kontrolüne.

Kuyruk önemlidir, çünkü Meta yavaş bir yanıtı yeniden dener. HandleWhatsAppEvent::dispatch() yalnızca kuyruk bağlantısı gerçekse ve bir worker çalışıyorsa hızlı döner. sync sürücüsünde iş istek içinde çalışır; yavaş bir model çağrısı veya veritabanı yazımı çift teslimata dönüşür.

Mesaj kimliğine, yani her mesajdaki wamid değerine göre tekilleştirin; yeniden denemeler istisna değil, olağandır. O sütunda benzersiz bir indeks ya da ona bağlı bir cache kilidi yeterlidir.

Bir de her kişinin en son ne zaman yazdığını saklayın. Bu zaman damgasıyla gönderim yolu metin ya da şablonu kendisi seçer; müşteri çoktan beklerken 131047 hatasından öğrenmeniz gerekmez. WhatsApp Business uygulamasında telefondan yazılan yanıtlar aynı rotaya echo olayları olarak gelir; böylece işleyici, bir kişinin görüşmeyi ne zaman devraldığını da görebilir.

Yaygın hatalar

  • hub.challenge değerini noktayla okumak. PHP adı hub_challenge yaptığı için işleyici boş gövde döndürür ve Meta asla doğrulamaz.
  • Webhook'u routes/web.php içine koymak. Meta'nın POST'unda CSRF token'ı yoktur ve istek 419 ile reddedilir.
  • sync kuyruğuna göndermek. İş 200'den önce çalışır, yavaş işleme yeniden denenir ve mesajlar iki kez işlenir.
  • Challenge değerini response()->json() ile döndürmek. Değerin etrafındaki tırnaklar Meta'nın kontrolünü geçemez.
Bunu EasyCoexistence'la yapmak

Numarayı easycoexistence.com üzerinden bağlayın, webhook hedefini anahtarı yolda olan Laravel rotanıza ayarlayın; phone number id ve token'ı panelden okuyun. Numara başına ayda US$ 9'dan başlar, numara ekledikçe US$ 1'e düşer; ilk 3 gün ücretsizdir.

Sık sorulan sorular

PHP SDK'sı var mı?

Bizden yok ve gerekmiyor. API Meta'nındır, Meta tarafından belgelenmiştir; Laravel'in HTTP istemcisi veya Guzzle ona doğrudan ulaşır.

Laravel olmadan çalışır mı?

Evet. Düz PHP'de $_GET['hub_challenge'] değerini okuyun, text/plain olarak yazdırın ve cURL ile gönderin. Alt çizgi kuralı her PHP framework'ü için geçerlidir.

URL'de yolda neden anahtar olmalı?

Çünkü işe yarayan kimlik doğrulama budur. Meta'nın imzası, asla paylaşılmayan Tech Provider uygulama sırrını kullanır; yabancıların sahte olay göndermesini URL'deki sır engeller.

Ekip telefonu yine kullanabilir mi?

Evet. Coexistence, numarada WhatsApp Business uygulamasının çalışmasını sürdürür; telefondan gönderilen mesajlar rotanıza echo olayları olarak ulaşır.

Okumaya devam edin

Başlamaya hazır mısınız?

WhatsApp Coexistence'ı aylar değil, dakikalar içinde kurun. Uygulama telefonda çalışmaya devam eder.

Ücretsiz denemeyi başlatın

Doğrulama tarihi

PHP ve Laravel'den WhatsApp mesajı gönderme