लॉग इनमोफत ट्रायल सुरू करा
Meta Tech Provider

PHP आणि Laravel मधून WhatsApp पाठवा आणि मिळवा

मेसेज मिळवण्यासाठी Laravel रूट लागतो, जो Meta च्या पडताळणीच्या GET ला उत्तर देतो आणि POST स्वीकारतो. PHP डॉट्सचे अंडरस्कोअर करते, म्हणून पॅरामीटर्स hub_mode, hub_verify_token आणि hub_challenge असे वाचावे लागतात. पाठवण्यासाठी Cloud API च्या मेसेज एंडपॉइंटवर नंबरचा फोन नंबर आयडी आणि टोकन वापरून एकच Http::withToken() POST पुरेसा आहे. SDK ची गरज नाही.

hub_challenge

PHP येणाऱ्या व्हेरिएबल नावांमधील डॉट्सचे अंडरस्कोअर करते, म्हणून hub.challenge हे hub_challenge असे वाचले जाते.

routes/api.php

install:api ने तयार होणारे Laravel चे स्टेटलेस एपीआय रूट्स /api अंतर्गत चालतात आणि वेब ग्रुपच्या CSRF संरक्षणाच्या बाहेर असतात.

v25.0

Meta च्या सध्याच्या मेसेज पाठवण्याच्या उदाहरणांमधील Graph API आवृत्ती, POST /{phone-number-id}/messages येथे.

Laravel मध्ये WhatsApp मेसेज कसे मिळवायचे?

routes/api.php मध्ये एकाच पाथवर एक GET आणि एक POST ठेवा. फाइल नसेल तर आधी php artisan install:api चालवा. एपीआय रूट्स स्टेटलेस असतात आणि वेब ग्रुपच्या बाहेर असतात, म्हणून CSRF टोकन नाही या कारणाने Meta चा POST नाकारला जात नाही. 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 च्या ॲप सीक्रेटने सही करते, त्यामुळे सहीचा हेडर तुमच्या बाजूने पडताळता येत नाही.

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 मधून WhatsApp मेसेज कसा पाठवायचा?

Laravel च्या HTTP क्लायंटने: फोन नंबर आयडीसाठी मेसेज एंडपॉइंटवर एक POST करा आणि अॅक्सेस टोकन बेअरर टोकन म्हणून द्या. दोन्ही मूल्ये कनेक्शनमधून मिळतात, ती डॅशबोर्डमध्ये दिसतात आणि get_api_credentials मधून परत येतात. ती कोडमध्ये न ठेवता एनव्हायरनमेंट व्हेरिएबल्सवर आधारित config/services.php मध्ये ठेवा.

बॉडीचा आकार वेळेवर अवलंबून असतो. ग्राहकाच्या शेवटच्या मेसेजनंतर 24 तासांच्या आत खाली दाखवल्याप्रमाणे text ऑब्जेक्ट चालते. त्या कालावधीनंतर Meta फक्त मंजूर टेम्प्लेट आणि त्याची भाषा सांगणारा टेम्प्लेट ऑब्जेक्ट स्वीकारते आणि मुक्त मजकूर त्रुटी 131047 सह अपयशी ठरतो. प्रतिसादातच हे दिसते: अपयशी कॉल त्रुटी ऑब्जेक्ट परत करतो, ज्याचा code काय चुकले ते सांगतो, म्हणून तो टाकून न देता लॉग करा.

विनंतीमधील काहीही EasyCoexistence साठी खास नाही. हा Meta च्या स्वतःच्या दस्तऐवजातील कॉल आहे, त्यामुळे कोणताही PHP HTTP क्लायंट, Guzzle किंवा साधा cURL, तसाच चालतो.

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', []));
}

यापलीकडे प्रोडक्शन 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 सोबत हे करताना

easycoexistence.com वर नंबर कनेक्ट करा, वेबहुकचे गंतव्य तुमच्या Laravel रूटवर सेट करा आणि त्याच्या पाथमध्ये की ठेवा, आणि डॅशबोर्डमधून फोन नंबर आयडी व टोकन वाचा. दर नंबर दरमहा US$ 9 पासून, नंबर वाढतील तसे US$ 1 पर्यंत कमी होते, आणि पहिले 3 दिवस मोफत.

वारंवार विचारले जाणारे प्रश्न

PHP SDK आहे का?

आमच्याकडून नाही, आणि त्याची गरजही नाही. एपीआय Meta चा आहे, Meta ने दस्तऐवजीकरण केलेला आहे, आणि Laravel चा HTTP क्लायंट किंवा Guzzle थेट त्यापर्यंत पोहोचतो.

हे Laravel शिवाय चालते का?

होय. साध्या PHP मध्ये $_GET['hub_challenge'] वाचा, text/plain म्हणून echo करा आणि cURL ने पाठवा. अंडरस्कोअरचा नियम प्रत्येक PHP फ्रेमवर्कला लागू आहे.

यूआरएलच्या पाथमध्ये की का लागते?

कारण तोच काम करणारा प्रमाणीकरणाचा मार्ग आहे. Meta ची सही Tech Provider च्या ॲप सीक्रेटवर आधारित असते, जे कधीही शेअर केले जात नाही, त्यामुळे यूआरएलमधील गुपितच अनोळखी लोकांना खोटे इव्हेंट्स पोस्ट करण्यापासून रोखते.

टीम अजूनही फोन वापरू शकते का?

होय. Coexistence नंबरवर WhatsApp Business ॲप चालू ठेवते, आणि फोनवरून पाठवलेले मेसेज तुमच्या रूटवर `echo` इव्हेंट्स म्हणून येतात.

पुढे वाचा

सुरुवात करण्यासाठी तयार आहात?

WhatsApp Coexistence काही मिनिटांत सेट करा, काही महिन्यांत नाही. ॲप फोनवर काम करत राहते.

मोफत ट्रायल सुरू करा

पडताळले:

PHP आणि Laravel मधून WhatsApp पाठवा