PHP اور Laravel سے WhatsApp میسج بھیجیں اور وصول کریں
وصول کرنا ایک Laravel روٹ ہے جو Meta کی تصدیق والے GET کا جواب دیتا ہے اور POST قبول کرتا ہے۔ پیرامیٹرز hub_mode، hub_verify_token اور hub_challenge کے ناموں سے پڑھیں، کیونکہ PHP ڈاٹس کو انڈرسکور میں بدل دیتا ہے۔ بھیجنے کے لیے Cloud API کے messages اینڈ پوائنٹ پر نمبر کے phone number id اور ٹوکن کے ساتھ ایک Http::withToken() POST کافی ہے۔ SDK کی ضرورت نہیں۔
PHP آنے والے ویری ایبل ناموں میں ڈاٹس کو انڈرسکور میں بدل دیتا ہے، اس لیے hub.challenge کو hub_challenge کے طور پر پڑھا جاتا ہے۔
Laravel کے اسٹیٹ لیس API روٹس، جو install:api سے بنتے ہیں، /api کے تحت چلتے ہیں اور ویب گروپ کی CSRF پروٹیکشن سے باہر ہوتے ہیں۔
Graph API کا وہ ورژن جو Meta کی موجودہ میسج بھیجنے والی مثالوں میں ہے، POST /{phone-number-id}/messages پر۔
Laravel میں WhatsApp میسج کیسے وصول کریں؟
routes/api.php میں ایک ہی پاتھ پر GET اور POST بنائیں۔ اگر فائل موجود نہ ہو تو پہلے php artisan install:api چلائیں۔ API روٹس اسٹیٹ لیس ہوتے ہیں اور ویب گروپ سے باہر، اس لیے Meta کا POST CSRF ٹوکن نہ ہونے پر رد نہیں ہوتا، جو routes/web.php کے روٹ پر ہو جاتا ہے۔
GET Meta کی تصدیق کا جواب دیتا ہے۔ Meta، hub.mode، hub.verify_token اور hub.challenge بھیجتا ہے، لیکن PHP آنے والے ویری ایبل ناموں کے ڈاٹس کو انڈرسکور بنا دیتا ہے، اس لیے Laravel کو hub_mode، hub_verify_token اور hub_challenge نظر آتے ہیں۔ جو کوڈ ڈاٹ والے نام پڑھتا ہے اسے null ملتا ہے اور تصدیق کبھی مکمل نہیں ہوتی۔ challenge کو سادہ متن کے طور پر لوٹائیں، response()->json() کے ذریعے نہیں۔
POST پے لوڈ کو قطار میں لگے جاب کے حوالے کرتا ہے اور فوراً 200 لوٹا دیتا ہے۔ پاتھ میں ایک لمبی رینڈم کی رکھیں اور دونوں روٹس پر اسے چیک کریں: Meta ڈیلیوری پر Tech Provider کے ایپ سیکرٹ سے دستخط کرتا ہے، اس لیے سگنیچر ہیڈر آپ کی طرف سے ویلیڈیٹ نہیں ہو سکتا۔
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 سے WhatsApp میسج کیسے بھیجیں؟
Laravel کے HTTP کلائنٹ سے: phone number id کے messages اینڈ پوائنٹ پر ایک POST، اور ایکسیس ٹوکن بطور بیئرر ٹوکن۔ دونوں ویلیوز کنکشن سے ملتی ہیں، ڈیش بورڈ میں نظر آتی ہیں اور get_api_credentials لوٹاتا ہے۔ انہیں کوڈ میں لکھنے کے بجائے config/services.php میں رکھیں جس کی ویلیوز ماحولیاتی ویری ایبلز سے آئیں۔
باڈی کی شکل وقت پر منحصر ہے۔ کسٹمر کے آخری میسج کے 24 گھنٹے کے اندر text آبجیکٹ چلتا ہے، جیسا نیچے ہے۔ اس مدت کے بعد Meta صرف template آبجیکٹ قبول کرتا ہے جس میں منظور شدہ ٹیمپلیٹ اور اس کی زبان کا نام ہو، اور آزاد متن ایرر 131047 کے ساتھ ناکام ہو جاتا ہے۔ جواب میں یہ نظر آ جاتا ہے: ناکام کال ایک ایرر آبجیکٹ لوٹاتی ہے جس کا code بتاتا ہے کہ کیا خرابی ہوئی، اسے ضائع کرنے کے بجائے لاگ کریں۔
درخواست میں کچھ بھی EasyCoexistence کے لیے مخصوص نہیں۔ یہ وہی کال ہے جو Meta کی اپنی دستاویزات میں ہے، اس لیے کوئی بھی PHP HTTP کلائنٹ، Guzzle ہو یا سادہ cURL، اسی طرح کام کرتا ہے۔
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', []));
}پروڈکشن میں Laravel ہینڈلر کو اس کے علاوہ کیا چاہیے؟
ایک حقیقی کیو، ڈپلیکیشن کی روک تھام، اور ونڈو کی جانچ۔
کیو اس لیے اہم ہے کہ Meta سست جواب پر دوبارہ کوشش کرتا ہے۔ HandleWhatsAppEvent::dispatch() تبھی جلدی لوٹتا ہے جب کیو کنکشن حقیقی ہو اور ورکر چل رہا ہو۔ sync ڈرائیور پر جاب درخواست کے اندر ہی چلتا ہے، اور سست ماڈل کال یا ڈیٹا بیس رائٹ ڈپلیکیٹ ڈیلیوری بن جاتا ہے۔
میسج آئی ڈی پر ڈپلیکیٹ ہٹائیں، یعنی ہر میسج میں موجود wamid پر، کیونکہ دوبارہ کوششیں غیر معمولی نہیں بلکہ عام بات ہیں۔ اس کالم پر یونیک انڈیکس، یا اسی پر مبنی کیش لاک کافی ہے۔
اور یہ بھی محفوظ کریں کہ ہر کانٹیکٹ نے آخری بار کب لکھا۔ اس ٹائم اسٹیمپ سے بھیجنے والا حصہ خود text یا ٹیمپلیٹ چن لیتا ہے، بجائے اس کے کہ کسٹمر کے انتظار کے بعد ایرر 131047 سے پتا چلے۔ WhatsApp Business ایپ میں فون سے لکھے گئے جوابات اسی روٹ پر echo ایونٹس کی صورت میں آتے ہیں، اس لیے ہینڈلر یہ بھی دیکھ سکتا ہے کہ کب کسی شخص نے گفتگو سنبھال لی۔
عام غلطیاں
- hub.challenge کو ڈاٹ کے ساتھ پڑھنا۔ PHP اسے hub_challenge بنا دیتا ہے، اس لیے ہینڈلر خالی باڈی لوٹاتا ہے اور Meta تصدیق نہیں کرتا۔
- ویب ہک کو routes/web.php میں رکھنا۔ Meta کے POST میں CSRF ٹوکن نہیں ہوتا اور اسے 419 کے ساتھ رد کر دیا جاتا ہے۔
- sync کیو پر ڈسپیچ کرنا۔ جاب 200 سے پہلے چلتا ہے، سست پروسیسنگ پر دوبارہ ڈیلیوری ہوتی ہے اور میسج دو بار پروسیس ہوتے ہیں۔
- challenge کو response()->json() سے لوٹانا۔ ویلیو کے گرد کوٹس Meta کی جانچ ناکام کر دیتے ہیں۔
easycoexistence.com پر نمبر کنیکٹ کریں، ویب ہک کی منزل اپنے Laravel روٹ پر رکھیں جس کے پاتھ میں کی ہو، اور phone number id اور ٹوکن ڈیش بورڈ سے لیں۔ قیمت US$ 9 فی نمبر ماہانہ سے شروع ہوتی ہے اور نمبر بڑھنے کے ساتھ US$ 1 تک آ جاتی ہے، اور پہلے 3 دن کا فری ٹرائل شامل ہے۔
اکثر پوچھے جانے والے سوالات
کیا PHP SDK موجود ہے؟
ہماری طرف سے نہیں، اور اس کی ضرورت بھی نہیں۔ API Meta کی ہے اور Meta ہی نے اس کی دستاویزات بنائی ہیں، اور Laravel کا HTTP کلائنٹ یا Guzzle اس تک براہ راست پہنچ جاتے ہیں۔
کیا یہ Laravel کے بغیر چلتا ہے؟
جی ہاں۔ سادہ PHP میں $_GET['hub_challenge'] پڑھیں، اسے text/plain کے طور پر echo کریں، اور بھیجنے کے لیے cURL استعمال کریں۔ انڈرسکور کا اصول ہر PHP فریم ورک پر لاگو ہوتا ہے۔
URL کے پاتھ میں کی کیوں چاہیے؟
کیونکہ یہی وہ تصدیق ہے جو کام کرتی ہے۔ Meta کا سگنیچر Tech Provider کے ایپ سیکرٹ سے بنتا ہے جو کبھی شیئر نہیں ہوتا، اس لیے URL کا راز ہی اجنبیوں کو جعلی ایونٹس پوسٹ کرنے سے روکتا ہے۔
کیا ٹیم پھر بھی فون استعمال کر سکتی ہے؟
جی ہاں۔ Coexistence نمبر پر WhatsApp Business ایپ کو چلتا رکھتی ہے، اور فون سے بھیجے گئے میسج آپ کے روٹ پر echo ایونٹس کی صورت میں پہنچتے ہیں۔
مزید پڑھیں
شروع کرنے کے لیے تیار ہیں؟
WhatsApp Coexistence چند منٹ میں سیٹ اپ کریں، مہینوں میں نہیں۔ ایپ فون پر کام کرتی رہتی ہے۔
فری ٹرائل شروع کریںتصدیق شدہ تاریخ