PHP ile WhatsApp API: Eksiksiz Entegrasyon Kılavuzu

WhatsApp API PHP Rehberi

WhatsApp API ile PHP: Eksiksiz Entegrasyon Kılavuzu

Bir WhatsApp hesabını bağlamak, mesaj gönderip almak, grupları yönetmek ve tüm sistemi çalıştırmak için Guzzle ve cURL çağrıları Laravel uygulama, bir Meta Business uygulaması kaydetmeden. Bu, PHP ile WhatsApp API uçtan uca: bağlantı, webhook'lar, çok kiracılı SaaS ve mesaj başına gerçek maliyet.
Meta İşletme doğrulaması yok
Guzzle ve cURL, terk edilmiş SDK yok
connect-whatsapp.php
kullan GuzzleHttp\Client; $client = yeni Müşteri([ 'base_uri' => 'https://api1.unipile.com:13111', 'headers' => ['X-API-ANAHTARI' => $apiKey], ]); // Sağlayıcı WHATSAPP: Meta uygulaması yok, WABA yok $res = $client->POST('/api/v1/accounts', [ 'json' => ['provider' => 'WHATSAPP'], ]);
201 Oluşturuldu, account_id döndürüldü
Aynı desen için LinkedIn Gmail Görünüm IMAP
Tanım

PHP'de WhatsApp API nedir?

Bu PHP ile WhatsApp API WhatsApp REST API'yi; Guzzle veya cURL gibi bir HTTP istemcisi kullanarak bir PHP çalışma zamanından, PHP-FPM'den, bir CLI betiğinden veya bir kuyruk çalıştırıcısından (queue worker) çağırma uygulamasıdır. PHP için özel olarak oluşturulmuş bir WhatsApp API'si yoktur: Meta ve API sağlayıcıları HTTPS üzerinden düz JSON sunar ve PHP, diğer herhangi bir web API'sini çağıracağı şekilde, yalnızca isteği yapan dildir.
Uygulamada, bir WhatsApp API PHP entegrasyonu normal bir HTTP çağrısıdır: bir metot, bir URL, bir JSON veya multipart gövde ve bir X-API-ANAHTAR başlık. Burada hiçbir şey sadece PHP'ye ait bir özelliğe veya sadece PHP'ye ait bir uç noktaya bağlı değildir. Cloud API, bir İş Çözümü Sağlayıcısı (BSP) ve bağlı bir hesap arasında değişen şey dil değil, WhatsApp numarasının kime ait olduğu ve Meta İşletme doğrulamasının sizinle ilk mesajınız arasında yer alıp almadığıdır. Bu ekosistemin tam dökümü için bkz. WhatsApp API entegrasyon kılavuzu.
HTTPS üzerinden Düz JSON
Her çağrı, Guzzle veya cURL'ün zaten nasıl yapılacağını bildiği bir istek/yanıt döngüsüdür.
Yetkilendirme statik bir üst bilgidir
Bir X-API-ANAHTAR değer, OAuth dansı yok, yazılacak token yenileme döngüsü yok.
Çalışma ortamından bağımsız
PHP-FPM'de, bir Symfony konsol komutunda veya bir Laravel kuyruk işinde (queue job) aynı şekilde çalışır.
Karar

PHP'den hangi WhatsApp API'sini kullanmalısınız?

PHP arka uç sisteminden WhatsApp'ı aramanın üç yolu vardır: Meta'nın Bulut API'si doğrudan, bir İş Çözümü Sağlayıcısı ona erişimi yeniden satmak, veya bir bağlı hesap Unipile gibi birleşik bir API aracılığıyla. Üçü de PHP kodunuzun aynı şekilde ayrıştırdığı JSON döndürür; değişen şey kurulum süresi, Meta İşletme doğrulamasının ilk mesajınızın önünde yer alıp almadığı ve mevcut bir sohbet geçmişi alıp almadığınız veya sıfırdan başlayıp başlamadığınızdır.
Kriterler
Bulut API (doğrudan)
BSP
Bağlı hesap
Meta İşletme Doğrulaması
Gerekli
Gerekli
Gerekli değil
İlk mesaja kadar geçen süre
Birkaç güne haftalar kala
Daha hızlı işe alım, altta yatan aynı gereksinimler
Dakika
Telefon numarası
WABA'ya yeni numara kaydedildi
BSP tarafından sağlanan yeni numara
Kullanıcının kendi mevcut WhatsApp numarası
Mevcut konuşmalara erişim
Hayır, boş başlar
Hayır, boş başlar
Evet, tüm geçmiş
En uygun
Birdçok müşteriye yayın yapan tek bir işletme numarası
Yönetilen bir katılım katmanı ile aynı
Her kullanıcının halihazırda sahip olduğu WhatsApp hesabını bağladığı bir ürün
PHP uygulamanız, her müşterinin kendi WhatsApp hesabını bağladığı bir SaaS ürünü ise, bağlı hesap Meta doğrulama adımını tamamen ortadan kaldırır. Tek bir şirket numarasından yayın yapıyorsanız, bunun yerine Cloud API veya bir BSP doğru başlangıç noktasıdır.
Bağlı bir hesapla oluştur
Kurulum

PHP kodu yazmadan önce neye ihtiyacınız var?

İhtiyacınız olan PHP 8.1 veya daha yeni, Besteci, the Guzzle HTTP istemcisi ve bir Unipile API anahtarı. Günümüzde Unipile için aktif olarak bakımı yapılan bir PHP SDK'sı bulunmamaktadır, bu nedenle bu kılavuzdaki her örnek şununla iletişim kurar: /api/v1 Doğrudan REST API.
PHP 8.1+
Tipli özellikler ve adlandırılmış argümanlar istemci kodunu kısa tutar.
Besteci
Guzzle'ı içe aktarmak için gereken standart bağımlılık yöneticisi.
Guzzle 7
cURL geri dönüşü (fallback) seçeneğiyle, JSON ve çok parçalı (multipart) istekler için HTTP istemcisi.
Unipile API anahtarı
Gönderildi X-API-ANAHTAR kontrol panelinizden oluşturulan her istekte.
terminal
composer require guzzlehttp/guzzle:^7.0
Bir PHP SDK var mı? Kurmanız gerekmeyen türden değil.
Bir topluluk paketi, unipile/unipile-php-sdk, Packagist'te mevcut, ancak şu şekilde listeleniyor: terk edilmiş: 17 Ekim 2023'ten beri commit yok, GitHub'da 5 yıldızı var ve eski bir API taban URL'sini hedefliyor. Çalıştırmayın composer require unipile/unipile-php-sdk. Node.js SDK'sı (unipile-node-sdk) resmi olarak sürdürülmektedir ve günceldir, ancak PHP için doğrudan REST API'ye karşı Guzzle güvenilir bir yoldur ve aşağıdaki her örnekte kullanılan şey budur. Bkz. Guzzle'ın belgeleri burada kullanılan istemci seçenekleri için.
Uygulama

WhatsApp hesabını PHP üzerinden nasıl bağlayabilirsiniz?

PHP'den bir WhatsApp hesabı bağlamak bir POSTA sağlayıcı olarak ayarlanmış istek WHATSAPP, ardından bir kullanıcı eylemi: son kullanıcı, WhatsApp > Bağlı Cihazlar bölümünden döndürülen QR kodunu tarar veya bunun yerine talep ettiyseniz telefonuna bir eşleştirme kodu girer. Meta geliştirici uygulaması yok, WABA yok, doğrulama adımı yok.
1
Bir kontrol noktası isteyin, varsayılan olarak QR kod
Yalnızca hesaplar uç noktasını çağırın provider küme. Unipile döndürür account_id ek olarak QR akışı için oluşturulmuş bir kontrol noktası yükü.
connect-qr.php
$response = $client->POST('/api/v1/accounts', [ 'json' => ['provider' => 'WHATSAPP'], ]); $payload = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $accountId = $payload['hesap_kimliği']; // $payload, ayrıca görüntülenecek kontrol noktasını da taşır WhatsApp > Bağlı Cihazlar bölümünden taranacak QR kodu // cihazlar. var_dump($payload) komutunu kendi anahtarınızla tekrar çalıştırın arayüzü bağlamadan önce tam şeklini görmek için.
2
Veya bunun yerine bir eşleştirme kodu isteyin
Geç telefon_numarasını_eşleştirme artı işareti olmadan E.164 rakamları olarak; örneğin bir destek temsilcisinin telefonu üzerinden bir müşteriyi sisteme kaydetmesi gibi QR kod taramanın pratik olmadığı durumlarda.
bağlantı-eşleştirme.php
$response = $client->POST('/api/v1/accounts', [ 'json' => [ 'provider' => 'WHATSAPP', 'eşleşen_telefon_numarası' => '33612345678', ], ]); $payload = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $accountId = $payload['hesap_kimliği']; Buradaki kontrol noktası, kullanıcıya arayüzünüzün gösterdiği kodudur // WhatsApp > Bağlı cihazlar > Cihaz bağla bölümüne yazmak için // yerine telefon numarası.
3
Hesap tamamen bağlanana kadar yokla
Hesap, bir BAĞLANIYOR QR kod taratılana veya eşleştirme kodu girilene kadar durum belirtin. Kontrol edin sources[0].status Hesaba.
anket-durumu.php
$response = $client->olsun(""/api/v1/accounts/{$accountId}""); $account = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $status = $account['kaynaklar'][0]['durum'] ?? boş; eğer ($status === 'TAMAM') { // $accountId üzerinde sohbetleri güvenli bir şekilde gönderebilir, alabilir ve listeleyebilirsiniz }
Döngü içinde yoklama (polling) yapmak işe yarar ancak istek israfına yol açar. PHP uygulamanızın halihazırda bir webhook uç noktası (endpoint) varsa, şununla bir tane kaydedin: hesap_durumu" yerine ve durum değiştiği anda tepki verin TAMAM.. Webhook kurulumunun kendisi gelen mesajlar için aşağıda ele alınmıştır, aynı uç nokta hesap durumu olaylarını da kabul eder.
Çekirdek akış

PHP ve Guzzle kullanarak nasıl WhatsApp mesajı gönderilir?

PHP'den mesaj göndermek bunlardan biridir POSTA sohbetin mesajlar uç noktasına bir text çok parçalı gövdedeki alan. Çağrı şના döndürür mesaj_id WhatsApp bunu kabul ettiği anda.
mesaj-gonder.php
$response = $client->POST(""/api/v1/chats/{$chatId}/messages"", [ 'multipart' => [ ['isim' => 'metin', 'içindekiler' => 'Merhaba! Siparişiniz kargoya verildi.'], ], ]); $sonuç = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $messageId = $result['mesaj_id'];
Aynı çok parçalı dizi ayrıca taşır EKLER, bir voice_message dosya veya bir tekrar_id Belirli bir mesaja yanıt vermek için Guzzle, bunları yanında ek multipart alanlar olarak ekler text. Her birinin ayrıntılı dökümü için WhatsApp API'nin desteklediği mesaj türü, şablonlar ve 24 saatlik hizmet penceresi dahil olmak üzere özel kılavuzumuza bakın.
Çekirdek akış

PHP'den yeni bir sohbeti nasıl başlatırsınız?

Henüz var olmayan bir sohbet başlatmak, chats uç noktasına (endpoint) bir account_id ve bir attendees_ids mevcut bir dizi yerine chat_id. Unipile sohbeti oluşturur ve eğer dahil ederseniz text alan, aynı çağrı içinde ilk mesajı gönderir.
start-conversation.php
$response = $client->POST('/api/v1/chats', [ 'multipart' => [ ['isim' => 'hesap_kimliği', 'içindekiler' => [$accountId], ['isim' => 'attendees_ids[]', 'içindekiler' => '33612345678@s.whatsapp.net'], ['isim' => 'metin', 'içindekiler' => 'Merhaba, ben Acme destek.'], ], ]); $sonuç = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $chatId = $result['chat_id'];
Alıcı şu şekilde belirlenir: {phone_number}@s.whatsapp.net, uluslararası rakamlar, başında artı işareti yok, boşluk yok. Döndürüleni sakla chat_id Bu kullanıcı kaydının yanında: ilk mesajdan sonraki her mesaj, bu uç nokta üzerinden değil, önceki bölümdeki mesajlar uç noktası üzerinden geçer.
Çekirdek akış

PHP'de sohbetleri ve mesajları nasıl alırsınız?

Çoğu WhatsApp API eğitimi mesaj göndermede kalır. Bir PHP arka ucunun genellikle bir kullanıcının mevcut sohbetlerini listelemesi, geçmişinde sayfalar halinde gezinmesi ve bir sohbet içinde kimlerin olduğunu görmesi de gerekir. Üç uç nokta bunu kapsar: GET /api/v1/chats, GET /api/v1/chats/{chat_id}/messagesve GET /api/v1/chats/{chat_id}/attendees, hepsi bir imleçle sayfalandırılmış.
Bir hesaptaki tüm WhatsApp sohbetlerini listele
sohbet-listele.php
$response = $client->olsun('/api/v1/chats', [ 'query' => [ ''account_id' => $accountId, 'account_type' => 'WHATSAPP', 'limit' => 50, ], ]); $data = json_decode($response->Gövdeyi Al()->İçerikleri Al(), true); $chats = $data['ürünler']; $nextCursor = $data['imleç'];
Bir sohbetin geçmişinde sayfa sayfa ilerle
mesajlari-listele.php
$cursor = boş; $all = []; yapmak { $res = $client->olsun(""/api/v1/chats/{$chatId}/messages"", [ 'sorgu' => dizi_filtrele(['imleç' => $cursor, 'limit' => 100]), ]); $page = json_decode($res->Gövdeyi Al()->İçerikleri Al(), true); $all = dizi_birleştir($all, $page['ürünler']); $cursor = $page['imleç']; } iken ($cursor !== boş);
Her liste uç noktası aynı imleç sözleşmesini izler: önceki yanıtın imleç geri gel, geri geldiğinde dur boş. Bir sohbetin içinde kimin olduğunu görmek için şunu çağırın: GET /api/v1/chats/{chat_id}/attendees: her katılımcınınkini döndürür id, provider_id ve arama yapabilmeniz için gereken şey olan görünen ad Katılımcı ekle veya katılımcıyıKaldır bu kılavuzun ilerleyen bölümlerindeki bir grubata.
Üretim

Bir PHP web kancası ile WhatsApp mesajları nasıl alınır?

PHP cinsinden bir WhatsApp webhook, Unipile'ın şu gibi durumlarda bir JSON veri yüküyle (payload) çağırdığı herkese açık bir HTTPS uç noktasıdır (endpoint): message_received. Komut dosyanız ham gövdeyi okur, çağrının gerçek olduğunu doğrular, hızlı bir şekilde yanıt verir ve asıl işi bir kuyruğa devreter. Yoklama GET /api/v1/chats yeni mesajlar için bu, bir demo için işe yarar, ancak bir avuçtan fazla kullanıcısı olan bir ürün için işe yaramaz.
1. Özel bir başlıkta paylaşılan bir gizli anahtar ile web kancasını kaydedin
webhook-kaydet.php
$client->POST('/api/v1/webhooks', [ 'json' => [ 'kaynak' => 'mesajlaşma', 'request_url' => 'https://example.com/webhooks/whatsapp', 'events' => ['mesaj_alındı'], 'headers' => [ ['anahtar' => 'X-Webhook-Secret', 'değer' => [$webhookSecret], ], ], ]);
2. Doğrulayın, yanıt verin ve ardından işleme koyun
public/webhooks/whatsapp.php
$rawBody = file_get_contents('php://input'); $provided = $_SERVER['HTTP_X_WEBHOOK_SECRET'] ?? ''; eğer (!hash_equals($expectedSecret, $provided)) { http_yanıt_kodu(401); çıkış; } http_yanıt_kodu(200); eğer (function_exists('fastcgi_finish_request')) { fastcgi_finish_request(); } $payload = json_decode($rawBody, true); eğer (($payload['olay'] ?? boş) === 'mesaj_alındı') { // $ yükünü bir kuyruk tablosuna veya Redis listesine ekle, // bir web kancasını asla satır içinde (inline) işlemeyin whatsapp_mesajini_kuyruga_ekle($payload); }
Unipile, webhook gövdesini yeniden hesapladığınız bir HMAC gizli anahtarı ile imzalamaz, create-webhook uç noktası bir başlıklar Bunun yerine dizi kullanın. Webhook'u kaydettiğinizde kendi gizli bilginizi özel bir başlık (custom header) olarak ekleyin ve ardından şunu kullanarak kontrol edin hash_equals(), yüke güvenmeden önce, zamanlama açısından güvenli bir dizi karşılaştırması. Her alan $yük, account_id, hesap_türü, Olay, chat_id, mesaj_id, message ve sender.attendee_provider_id, mesajlaşma webhook'u için JSON Unipile belgeleriyle eşleşir.
Üretim

WhatsApp API'sini bir Laravel uygulamasına nasıl entegre edersiniz?

Laravel, yukarıdaki saf PHP örneklerindeki üç şeyi değiştirir: Http elle yazılmış bir Guzzle istemcisi yerine bir facade, satır içi (inline) işleme yerine kuyruğa alınmış bir iş (queued job) ve veri ayrıştırma (parsing) yerine bir rota artı kontrolcü php://input elde. Alttaki WhatsApp aramaları, bu kılavuzdaki diğer tüm örneklerle tamamen aynıdır.
1. Yapılandırmaservices.php içinde tek bir kayıt, değerler .env dosyasından
config/services.php
return [ // ...mevcut servisler 'unipile' => [ 'base_uri' => çevre('UNIPILE_BASE_URI', 'https://api1.unipile.com:13111'), 'api_anahtari' => çevre('UNIPILE_API_ANAHTARI'), 'webhook_gizli_anahtari' => çevre('UNIPILE_WEBHOOK_SECRET'), ], ];
Http facade'i üzerinde ince bir servis sınıfı
app/Services/WhatsappService.php
ad alanı App\Services; kullan Illuminate\Support\Facades\Http; sınıf WhatsappServisi { korumalı fonksiyon müşteri() { return Http::temelUrl(yapılandırma('services.unipile.base_uri')) ->başlıklarIle(['X-API-ANAHTARI' => yapılandırma('services.unipile.api_key')]); } halka açık fonksiyon sendMessage(dizi $chatId, dizi ($ metni): dizi { return $bu->müşteri() ->çokluParçaOlarak() ->POST(""/api/v1/chats/{$chatId}/messages"", [ ['isim' => 'metin', 'içindekiler' => [$text], ]) ->json(); } }
3. Rota ve webhook kontrolcüsü
routes/api.php
Rota::POST('/webhooks/whatsapp', [WhatsappWebhookController::sınıf, 'kulplamak']);
app/Http/Controllers/WhatsappWebhookController.php
public function handle(Request $request) { $provided = $request->header('X-Webhook-Secret', ''); if (!hash_equals(config('services.unipile.webhook_secret'), $provided)) { abort(401); } if ($request->input('event') === 'message_received') { ProcessWhatsappMessage::dispatch($request->all()); } return response()->json(['status' => 'received']); }
4. Webhook rotasının hızlı kalmasını sağlayan kuyruğa alınmış bir iş (job)
app/Jobs/ProcessWhatsappMessage.php
sınıf WhatsAppMesajiniIsle uygulamalar KuyruğaAlınmalı { kullan Dispatchable, InteractsWithQueue, Queueable, SerializesModels; halka açık fonksiyon __construct(halka açık dizi $payload) {} halka açık fonksiyon kulp(): hükümsüz { // $this->payload['account_id'] değerine göre kiracıyı ara, // mesajı kaydet, doğru kullanıcıyı bilgilendir } }
Rota hiçbir zaman doğrudan Guzzle'a dokunmaz, şuradan geçer: WhatsappServisi, bu da testlerde WhatsApp aramalarının diğer tüm Laravel HTTP entegrasyonları gibi taklit edilebilmesini (mockable) sağlar. Bakınız Laravel'in HTTP istemcisi belgeleri test suite'inizde bu istekleri taklit etmek için.
Laravel ile inşa edin
Üretim

WhatsApp gruplarını PHP'den nasıl yönetirsiniz?

PHP'den bir WhatsApp grubunu yönetmek tek bir YAMA sohbet uç noktasına çağrı eylem alan Katılımcı ekle, katılımcıyıKaldırveya davetBağlantısı Al. Meta'nın kendi Bulut API'si grup özelliği bir grubu şununla sınırlandırır: 8 katılımcı ve doğrudan birini eklemek için hiçbir uç nokta sunmaz, yalnızca paylaşılacak bir davet bağlantısı sunar.
Katılımcı ekle
katilimci-ekle.php
$client->yama(""/api/v1/chats/{$groupChatId}"", [ 'json' => [ 'eylem' => 'katılımcıEkle', 'değer' => '33612345678@s.whatsapp.net', ], ]);
Davet bağlantısını al
davet-linki.php
$res = $client->yama(""/api/v1/chats/{$groupChatId}"", [ 'json' => ['action' => 'davetBağlantısınıAl'], ]); $link = json_decode($res->Gövdeyi Al()->İçerikleri Al(), true)['davet_bağlantısı'];
katılımcıyıKaldır aynı şekli alır Katılımcı ekle, katılımcının WhatsApp ID'si ile değer. Meta's kendi Gruplar API'sinin hiçbir şekilde sunmadığı tek eylem budur; birini eklemek yalnızca onların tarafındaki davet bağlantısı aracılığıyla gerçekleşir. Numara başına 10.000 grup sınırı ve hâlâ desteklenmeyen özellikler dahil tüm sınırlar için bkz. WhatsApp Grup API'si referans.
Grup yönetimi oluştur
Ölçek

Tek bir PHP uygulamasından çok sayıda kullanıcı hesabını nasıl yönetirsiniz?

Bir PHP SaaS ürününün tek bir WhatsApp hesabı yoktur, her müşteri için bir tane vardır. Tek bir Unipile vardır X-API-ANAHTAR tüm uygulamanız için, ancak ayrı bir account_id WhatsApp'larını bağlayan her son kullanıcı için. Bunun saklanması kalıptır account_id kendi kiracı satırınızın yanında ve aksi takdirde hesaplar arası geçiş yapabilecek her çağrıda açıkça iletin.
route-by-tenant.php
// Webhook işleyicisinin içinde: bunun hangi kiracı olduğunu bulun // mesaj, üzerinde herhangi bir işlem yapılmadan öncesine aittir. $stmt = $pdo->hazırla('SELECT id FROM tenants WHERE unipile_account_id = ?'); $stmt->yürüt([$payload['hesap_kimliği']]); $tenantId = $stmt->sütunGetir(); eğer ($tenantId === Yanlış) { // bilinmeyen account_id, kiracıyı tahmin etmek yerine reddet http_yanıt_kodu(404); çıkış; } // Giden: eski veya yeniden kullanılan bir chat_id'nin Asla yanlış kiracının WhatsApp numarası üzerinden göndermeyin. $client->POST(""/api/v1/chats/{$chatId}/messages"", [ 'multipart' => [ ['isim' => 'metin', 'içindekiler' => [$text], ['isim' => 'hesap_kimliği', 'içindekiler' => [$expectedAccountId], ], ]);
İsteğe bağlı account_id mesajlar uç noktasındaki alan, özellikle o hesap dışındaki bir sohbete gönderim yapılmasını engellemek için bulunur; API zorunlu kılmasa bile çok kiracılı bir kod tabanında bunu zorunlu olarak ele alın. Depolananı şifreleyin account_id diğer tüm müşteri kimlik bilgileri gibi bekleme durumundaki değerler: kendi başlarına gizli değildirler, ancak kullanıcılar tablonuz ile birinin gerçek WhatsApp konuşmaları arasındaki birleştirme anahtarıdırlar.
Sakıncalar

En yaygın PHP'ye özgü hatalar nelerdir?

Bir PHP kod tabanındaki çoğu WhatsApp API hatası, API'den değil, PHP'nin kendisinden kaynaklanır. Bunlardan beşi, canlı ortam entegrasyonlarında sürekli olarak karşımıza çıkıyor.
mb_substr() yerine substr() kullanarak bir mesajı kısaltmak
PHP'nin substr() karakterleri değil baytları sayar. Bir emoji çok baytlı bir UTF-8 dizisidir, onu yarıdan keserseniz bozuk bir karakter veya geçersiz JSON gönderirsiniz. Kullanıcı tarafından oluşturulan WhatsApp metinlerinde her zaman çok baytlı fonksiyonları kullanın.
Düzelt
$safe = mb_substr($text, 0, 4096, 'UTF-8');
Windows ve XAMPP üzerinde cURL hatası 60
"SSL sertifikası sorunu: yerel veren sertifikası alınamıyor." Windows PHP sürümleri ve XAMPP genellikle php.ini dosyasına eklenmiş güncel bir CA paketi olmadan gelir; bu nedenle kod doğru olsa bile Guzzle'ın HTTPS çağrıları başarısız olur.
php.ini dosyasını düzelt
curl.cainfo = "C:\php\extras\cacert.pem" openssl.cafile = "C:\php\extras\cacert.pem"
max_execution_time, webhook yanıt vermeden önce onu sonlandırıyor
İşleyici yanıt vermeden önce yavaş bir giden çağrı yapana kadar 30 saniyelik bir varsayılan süre fazlasıyla yeterlidir. Unipile hızlı bir yanıt alamazsa yeniden dener ve yavaş bir işleyici aynı mesajı iki kez işlemeye başlar. Yukarıdaki webhook bölümünde gösterildiği gibi, önce yanıt verin, sonra çalışın.
429 veya 5xx yanıtlarında bekleme süresi (backoff) yok
Sıkı iken Hata alındığında hemen yeniden denenen bir döngü, bir oran sınırını kendi yarattığımız bir kesintiye dönüştürür. Bekleyin ve arka arkaya gelen her hatada bekleme süresini artırın.
Düzelt
için ($attempt = 1; $attempt <= 5; $attempt++) { denemek { return $client->POST($uri, $options); } yakalamak (ConnectException | ServerException $e) { usleep((2 ** $attempt) * 100_000); // 0.2s, 0.4s, 0.8s... } }
Ham yanıtı günlüğe kaydedip buna hata ayıklamak demek
Guzzle'ın kendi mekanizmasını kullanmak yerine JSON gövdesini (body) elle oluşturursanız json seçenek işle, ekle JSON_UNESCAPED_UNICODE için json_encode(). Onsuz, emojiler ve aksanlı isimler kaçış karakterleriyle görünür \u günlüklerinizde, hata ayıklamaya çalışırken gerçek bir konuşmada okunamaz olan ancak teknik olarak geçerli JSON olan diziler.
Maliyet

PHP'den WhatsApp mesajı göndermenin maliyeti ne kadardır?

PHP kodunda fiyatı değiştiren hiçbir şey yok. Meta faturalandırır 1 Temmuz 2025'ten beri mesaj başına, konuşma başına değil. Kodunuzun kontrol ettiği tek şey zamanlamadır: Bir kullanıcının mesajından sonraki 24 saatlik hizmet penceresi içinde gönderilen bir yanıt hâlâ ücretsizdir, bir saat sonra gönderilen aynı arama ise ücretlidir.
Yardımcı program ve kimlik doğrulama şablonları Açık servis penceresi içinde ücretsiz kalın, dışında faturalandırılır.
Pazarlama şablonları pencereden bağımsız olarak faturalandırılır.
Mesaj başına ücretler, gönderdiğiniz istemci kütüphanesine göre değil, alıcı ülkeye ve mesaj kategorisine göre değişiklik gösterir.
PHP webhook'unuzun aldığı her gelen mesaja zaman damgası vurun ve konuşma başına bir "pencere açık bitiş zamanı" değeri tutun; faturalandırma mantığınızın gerçekten ihtiyaç duyduğu tek girdi budur. Mevcut için mesaj başına WhatsApp fiyatlandırması ülkeye ve kategoriye göre fiyatlandırmanın tamamını inceleyin.

PHP ile WhatsApp API - SSS

Bağlanma, gönderme, Laravel ve terk edilmiş PHP SDK hakkında net yanıtlar.
Unipile REST API'yi hedefleyen bir Guzzle istemcisi oluşturun, çağırın POST /api/v1/accounts sağlayıcı ile WHATSAPP bir QR kod veya eşleştirme kodu almak için, kullanıcıdan bunu telefonunda tamamlamasını isteyin, ardından şu işlem için aynı istemciyi kullanın: GET, POSTA ve YAMA mesaj gönderme, sohbetleri listeleme ve grupları yönetme çağrıları. PHP'ye özgü bir uç nokta yoktur, her çağrı, bir X-API-ANAHTAR başlık. Bir WhatsApp hesabı bağlayın Yukarıdaki bölüm tam kodu adım adım açıklamaktadır.
Evet. Tek bir POSTA için /api/v1/sohbetler/{sohbet_kimliği}/mesajlar with a text çok parçalı (multipart) gövdedeki alan mesajı gönderir ve bir mesaj_id, gör bölüm gönder tam Guzzle çağrısı için yukarıya bakın.
Yalnızca doğrudan Meta'nın Bulut API'si veya onun üzerine inşa edilmiş bir İş Çözümü Sağlayıcısı aracılığıyla giderseniz. Unipile aracılığıyla bir WhatsApp hesabı bağlamak, kullanıcının mevcut WhatsApp numarasını QR kodu veya eşleştirme koduyla bağlar ve hiçbir Meta İşletme doğrulaması gerektirmez.
Aktif olarak bakımı yapılan bir tane yok. Bir topluluk paketi, unipile/unipile-php-sdk, Packagist'te yer alıyor ancak işaretlenmiş terk edilmiş, 17 Ekim 2023'ten beri hiçbir commit'i yok ve GitHub'da 5 yıldıza sahip. Bu kılavuzdaki her örnek, bunun yerine doğrudan Guzzle aracılığıyla REST API'yi çağırır; bu zaten terk edilmiş SDK'nın da dahili olarak yaptığı şeydi.
Herkese açık olarak erişilebilen bir HTTPS URL'si olmadan webhook alamazsınız, HTTP geri aramaları (callbacks) bu şekilde çalışır. Yerel geliştirme sırasında, ngrok benzeri bir servis ile yerel bir portu tünelleyin ve webhook'un request_url tünelin HTTPS adresinde. İleti uç noktasını yoklama genel bir uç noktanın gerçekten mümkün olmadığı durumlarda, gecikme ve ek istekler pahasına başvurulan yedek yöntemdir.
Evet, bunun hiçbir yönü belirli bir çatlya (framework) özgü değildir. Laravel bölümü yukarıdaki, aynı Guzzle eşdeğer çağrılarını şurada sarmalar: Http cephe, kuyruğa alınmış bir iş (queued job) ve bir webhook rotası ile kontrolcüsü; bir Laravel kod tabanında bunu yapılandırmanın en deyimsel (idiomatik) yolu budur.
Evet, bu normal SaaS yapısıdır. Tek bir Unipile API anahtarı tüm uygulamayı kapsarken, her son kullanıcı kendi anahtarına sahip olur account_id WhatsApp'ları bağlandıktan sonra. Bu kimliği (id) kiracı kaydınızın yanında saklayın ve çapraz kiracı gönderimlerini önlemek için giden aramalarda iletin, şuraya bakın: çok kiracılı bölüm üstünde.
PATCH /api/v1/chats/{chat_id} ile {"action": "addParticipant", "value": "@s.whatsapp.net"}. Meta'sün kendi Cloud API grup özelliğinin eşdeğer bir uç noktası yoktur, yalnızca bir davet bağlantısı vardır; bu da doğrudan Meta üzerinde geliştirme yapmak ile Unipile üzerinden gitmek arasındaki daha net farklardan biridir. Ayrıntılar şurada: gruplar bölümü üstünde.
Neredeyse her zaman bir dizgi şununla kesildiği için substr() yerine mb_substr(). PHP'nin düz metin fonksiyonları bayt sayar ve bir emoji çok baytlı bir UTF-8 dizisidir; ortadan kesildiğinde geçersiz bir karakter haline gelir veya JSON verisini tamamen bozar.
Guzzle yeterlidir, PHP'nin cURL uzantısının üzerine kurulmuş bir HTTP istemcisidir, onun yerine geçen bir şey değildir. Bu kılavuzdaki her istek Guzzle kullanır; ham curl_init() call, bir proje bağımlılığı ekleyemediğinde aynı şekilde çalışır, JSON ve çok parçalı (multipart) gövdeler her iki durumda da aynıdır.
Diğer herhangi bir şekilde göndermekle aynı. Meta, API'yi çağırmak için kullanılan istemci kütüphanesine göre değil, kategoriye ve alıcı ülkeye bağlı olarak 1 Temmuz 2025'ten beri mesaj başına ücret almaktadır. Bkz. maliyet bölümü yukarıdaki ve tam fiyatlandırma kılavuzu güncel oranlar için.
Evet, ortadan kalkmıyor, sadece teknik olarak neyin izin verildiğinden ziyade neyin ücretsiz olduğunu belirliyor. Kullanıcının son mesajından sonraki 24 saatlik pencere içinde verilen bir yanıt, şablon mesaj olarak ücretlendirilmeden gönderilir; pencereyi dikkate almayan PHP kodu ise gereksiz yere mesaj ücreti öder.

Bunu PHP ile oluşturma konusunda hâlâ sorularınız mı var? Ekibimiz yardımcı olmak için burada.

Bir uzmanla konuşun
WhatsApp API PHP Rehberi

WhatsApp API'sini PHP uygulamanıza entegre etmeye hazır mısınız?

Bu kılavuzdaki her uç nokta (connect, send, receive, groups), şu anda hemen oluşturabileceğiniz aynı Unipile hesabı üzerinde çalışır. Meta İşletme doğrulaması yok, terk edilmiş bir SDK yok, sadece Guzzle ve PHP uygulamanızın zaten nasıl çağıracağını bildiği bir REST API.
Mevcut bir uygulamaya entegre etmek yerine otomatikleştirmek mi? Okuyun Python'daki aynı entegrasyon.
tr_TRTR