లాగిన్ చేయండిఉచిత ట్రయల్ ప్రారంభించండి
Meta Tech Provider

PHP, Laravel నుండి WhatsApp మెసేజ్‌లు పంపండి, స్వీకరించండి

స్వీకరణ అంటే Meta ధృవీకరణ GET అభ్యర్థనకు సమాధానమిచ్చి, POSTలను అంగీకరించే Laravel రూట్. PHP చుక్కలను అండర్‌స్కోర్‌లుగా మారుస్తుంది కాబట్టి పారామీటర్లను hub_mode, hub_verify_token, hub_challenge అని చదవాలి. పంపడానికి ఆ నంబర్ phone number id, టోకెన్‌తో Cloud API మెసేజ్‌ల ఎండ్‌పాయింట్‌కు ఒక Http::withToken() POST చాలు. SDK అవసరం లేదు.

hub_challenge

PHP ఇన్‌కమింగ్ వేరియబుల్ పేర్లలోని చుక్కలను అండర్‌స్కోర్‌లుగా మారుస్తుంది, కాబట్టి hub.challenge ను hub_challenge గా చదవాలి.

routes/api.php

install:api సృష్టించే Laravel స్టేట్‌లెస్ API రూట్‌లు /api కింద అందుతాయి, వెబ్ గ్రూప్ CSRF రక్షణకు వెలుపల ఉంటాయి.

v25.0

Meta ప్రస్తుత మెసేజ్ పంపే ఉదాహరణలలోని Graph API వెర్షన్, POST /{phone-number-id}/messages వద్ద.

Laravel లో WhatsApp మెసేజ్‌లను ఎలా స్వీకరించాలి?

routes/api.php లో ఒకే పాత్‌పై ఒక GET, ఒక POST పెట్టండి. ఆ ఫైల్ లేకపోతే ముందు php artisan install:api నడపండి. 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 క్లయింట్‌తో: ఆ phone number id కోసం మెసేజ్‌ల ఎండ్‌పాయింట్‌కు ఒక POST, యాక్సెస్ టోకెన్‌ను బేరర్ టోకెన్‌గా జత చేయండి. ఈ రెండు విలువలు కనెక్షన్ నుంచి వస్తాయి, డాష్‌బోర్డ్‌లో కనిపిస్తాయి, get_api_credentials ద్వారా కూడా లభిస్తాయి. వాటిని కోడ్‌లో కాకుండా ఎన్విరాన్‌మెంట్ వేరియబుల్స్ ఆధారంగా config/services.php లో ఉంచండి.

బాడీ రూపం సమయంపై ఆధారపడుతుంది. కస్టమర్ చివరి మెసేజ్ నుంచి 24 గంటల్లోపు, కింద చూపినట్లు text ఆబ్జెక్ట్ పనిచేస్తుంది. ఆ విండో దాటాక, ఆమోదించిన టెంప్లేట్ పేరు, భాషతో కూడిన template ఆబ్జెక్ట్‌ను మాత్రమే Meta అంగీకరిస్తుంది, స్వేచ్ఛా రూప టెక్స్ట్ ఎర్రర్ 131047 తో విఫలమవుతుంది. ప్రతిస్పందనలోనే అది కనిపిస్తుంది: విఫలమైన కాల్ ఒక error ఆబ్జెక్ట్‌ను ఇస్తుంది, దాని 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 డ్రైవర్‌లో జాబ్ అభ్యర్థనలోపలే నడుస్తుంది, నెమ్మదైన మోడల్ కాల్ లేదా డేటాబేస్ రైట్ వల్ల డూప్లికేట్ డెలివరీ అవుతుంది.

మెసేజ్ id, అంటే ప్రతి మెసేజ్‌లోని wamid, ఆధారంగా డీడూప్లికేట్ చేయండి, ఎందుకంటే మళ్లీ ప్రయత్నాలు అరుదు కాదు, సాధారణమే. ఆ కాలమ్‌పై యూనిక్ ఇండెక్స్ లేదా దానిపై ఆధారపడిన క్యాష్ లాక్ సరిపోతుంది.

ఇంకా, ప్రతి కాంటాక్ట్ చివరిసారి ఎప్పుడు రాశారో నిల్వ చేయండి. ఆ టైమ్‌స్టాంప్‌తో, కస్టమర్ అప్పటికే వేచి ఉన్నాక ఎర్రర్ 131047 ద్వారా తెలుసుకోకుండా, పంపే మార్గం టెక్స్ట్ లేదా టెంప్లేట్‌ను తానే ఎంచుకుంటుంది. WhatsApp Business యాప్‌లో ఫోన్‌లో టైప్ చేసిన సమాధానాలు అదే రూట్‌కు echo ఈవెంట్‌లుగా వస్తాయి, కాబట్టి ఒక వ్యక్తి సంభాషణను చేపట్టినప్పుడు హ్యాండ్లర్ కూడా గుర్తించగలదు.

సాధారణ పొరపాట్లు

  • hub.challenge ను చుక్కతో చదవడం. PHP దాన్ని hub_challenge గా మార్చింది, కాబట్టి హ్యాండ్లర్ ఖాళీ బాడీ ఇస్తుంది, Meta ధృవీకరణ ఎప్పటికీ పూర్తికాదు.
  • వెబ్‌హుక్‌ను routes/web.php లో పెట్టడం. Meta POST లో CSRF టోకెన్ ఉండదు, 419 తో తిరస్కరణకు గురవుతుంది.
  • sync క్యూకు డిస్పాచ్ చేయడం. జాబ్ 200 కంటే ముందే నడుస్తుంది, నెమ్మదైన ప్రాసెసింగ్‌ను Meta మళ్లీ ప్రయత్నిస్తుంది, మెసేజ్‌లు రెండుసార్లు ప్రాసెస్ అవుతాయి.
  • challenge ను response()->json() తో తిరిగి ఇవ్వడం. విలువ చుట్టూ ఉండే కోట్‌లు Meta తనిఖీని విఫలం చేస్తాయి.
EasyCoexistenceతో దీన్ని చేయడం

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 సెటప్ చేయండి. యాప్ ఫోన్‌లో పనిచేస్తూనే ఉంటుంది.

ఉచిత ట్రయల్ ప్రారంభించండి

ధృవీకరించిన తేదీ

PHP, Laravel నుండి WhatsApp మెసేజ్ పంపండి