පුරනය වන්නනොමිලේ trial කාලය ආරම්භ කරන්න
Meta Tech Provider

PHP සහ Laravel වෙතින් WhatsApp යැවීම සහ ලැබීම

ලබාගැනීම යනු Meta ගේ සත්‍යාපන GET එකට පිළිතුරු දී POST ඇතුළත් කරගන්නා Laravel route එකකි. PHP තිත් යටි ඉරි බවට හරවන නිසා පරාමිති කියවන්නේ hub_mode, hub_verify_token සහ hub_challenge ලෙසයි. යැවීම යනු අංකයේ phone number id සහ token එක සමඟ Cloud API හි messages endpoint එකට Http::withToken() POST එකක් පමණි. SDK එකක් අවශ්‍ය නොවේ.

hub_challenge

PHP ඇතුළු වන විචල්‍ය නම්වල තිත් යටි ඉරි බවට හරවන නිසා hub.challenge කියවෙන්නේ hub_challenge ලෙසයි.

routes/api.php

install:api මගින් සාදන Laravel හි stateless API route, /api යටතේ සේවය කෙරෙන අතර web group එකේ CSRF ආරක්ෂාවෙන් පිටත පවතී.

v25.0

Meta ගේ වත්මන් පණිවිඩ යැවීමේ උදාහරණවල Graph API අනුවාදය, POST /{phone-number-id}/messages හි.

Laravel හිදී WhatsApp පණිවිඩ ලබාගන්නේ කෙසේද?

routes/api.php හි එකම path එකට GET එකකින් සහ POST එකකින්. ගොනුව නොමැති නම් මුලින් php artisan install:api ධාවනය කරන්න. API route stateless වන අතර web group එකෙන් පිටත පවතින නිසා, routes/web.php හි route එකකට සිදුවන පරිදි CSRF token එකක් නැතැයි Meta ගේ POST ප්‍රතික්ෂේප නොවේ.

GET එක Meta ගේ සත්‍යාපනයට පිළිතුරු දෙයි. Meta එවන්නේ hub.mode, hub.verify_token සහ hub.challenge ය. නමුත් PHP ඇතුළු වන විචල්‍ය නම්වල තිත් යටි ඉරි බවට හරවන නිසා Laravel දකින්නේ hub_mode, hub_verify_token සහ hub_challenge ය. තිත් සහිත නම් කියවන කේතයට ලැබෙන්නේ null ය, සත්‍යාපනය කිසිදා සිදු නොවේ. challenge එක response()->json() හරහා නොව සාමාන්‍ය පෙළක් ලෙස ආපසු දෙන්න.

POST එක payload එක queue කළ job එකකට භාර දී වහාම 200 ආපසු දෙයි. path එකේ දිගු අහඹු යතුරක් තබා route දෙකේදීම එය පරීක්ෂා කරන්න. Meta බෙදාහැරීම්වලට අත්සන් කරන්නේ Tech Provider ගේ app secret එකෙන් නිසා, අත්සන් header එක ඔබේ පැත්තෙන් වලංගු කළ නොහැක.

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 client එකෙන්: phone number id එකට අදාළ `/messages` endpoint එකට POST එකක්, access token එක bearer token එකක් ලෙස. අගය දෙකම සම්බන්ධතාවයෙන් ලැබේ, dashboard එකේ පෙන්වන අතර get_api_credentials මගින් ආපසු දෙයි. ඒවා කේතයේ නොව, පරිසර විචල්‍යවලින් ලබාගන්නා config/services.php හි තැබිය යුතුය.

body එකේ හැඩය කාලය මත රඳා පවතී. පාරිභෝගිකයාගේ අවසන් පණිවිඩයෙන් පැය 24ක් ඇතුළත පහත පරිදි text object එකක් ක්‍රියා කරයි. ඒ කාල සීමාවෙන් පසු Meta පිළිගන්නේ අනුමත template එකක් සහ එහි භාෂාව නම් කරන template object එකක් පමණි, නිදහස් පෙළ 131047 දෝෂයෙන් අසාර්ථක වේ. එය දැකීමට හොඳම තැන ප්‍රතිචාරයයි: අසාර්ථක call එකක් ආපසු දෙන error object එකේ කේතය මගින් වරද කියයි, එබැවින් එය ඉවත නොදමා log කරන්න.

request එකේ කිසිවක් EasyCoexistence ට විශේෂිත නොවේ. එය Meta ගේම ලේඛනයේ ඇති call එකයි, එබැවින් Guzzle හෝ සාමාන්‍ය cURL වැනි ඕනෑම PHP HTTP client එකක් එලෙසම ක්‍රියා කරයි.

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

මීට අමතරව production Laravel handler එකකට අවශ්‍ය කුමක්ද?

සැබෑ queue එකක්, අනුපිටපත් ඉවත් කිරීමක් සහ කාල සීමා පරීක්ෂාවක්.

Meta ප්‍රමාද වූ ප්‍රතිචාරයක් නැවත උත්සාහ කරන නිසා queue එක වැදගත් වේ. HandleWhatsAppEvent::dispatch() ඉක්මනින් ආපසු එන්නේ queue connection එක worker එකක් ධාවනය වන සැබෑ එකක් වූ විට පමණි. sync driver එකේදී job එක request එක ඇතුළත ධාවනය වන අතර, මන්දගාමී model call එකක් හෝ database ලිවීමක් අනුපිටපත් බෙදාහැරීමක් බවට පත් වේ.

පණිවිඩ id එක, එනම් එක් එක් පණිවිඩයේ ඇති wamid එක අනුව අනුපිටපත් ඉවත් කරන්න, මන්ද නැවත උත්සාහ කිරීම් සාමාන්‍ය දෙයක් මිස ව්‍යතිරේකයක් නොවේ. එම තීරුවේ unique index එකක් හෝ එය යතුරු කරගත් cache lock එකක් ප්‍රමාණවත් වේ.

සහ සම්බන්ධතාවක් අවසන් වරට ලිවූ වේලාව ගබඩා කරන්න. එම වේලාව ඇති විට, පාරිභෝගිකයා දැනටමත් බලා සිටීමෙන් පසු 131047 දෝෂයෙන් දැනගන්නා වෙනුවට, යැවීමේ පියවර තනිවම text හෝ template තෝරයි. WhatsApp Business යෙදුමේ දුරකථනයෙන් ටයිප් කළ පිළිතුරු එම route එකටම echo events ලෙස පැමිණෙන නිසා, පුද්ගලයෙකු සංවාදයක් භාර ගත් විට handler එකටද එය දැකිය හැක.

සාමාන්‍ය වැරදි

  • hub.challenge තිතක් සහිතව කියවීම. PHP එය hub_challenge ලෙස නම් කර ඇති නිසා handler එක හිස් body එකක් ආපසු දෙන අතර Meta කිසිදා සත්‍යාපනය නොකරයි.
  • webhook එක routes/web.php හි තැබීම. Meta ගේ POST එකේ CSRF token එකක් නැති නිසා 419 මගින් ප්‍රතික්ෂේප වේ.
  • sync queue එකට dispatch කිරීම. job එක 200 ට පෙර ධාවනය වේ, මන්දගාමී සැකසීම නැවත උත්සාහ කෙරේ, පණිවිඩ දෙවරක් සැකසේ.
  • challenge එක response()->json() මගින් ආපසු දීම. අගය වටා ඇති උද්ධෘත ලකුණු Meta ගේ පරීක්ෂාව අසාර්ථක කරයි.
EasyCoexistence සමඟ මෙය කිරීම

easycoexistence.com හිදී අංකය සම්බන්ධ කර, webhook ගමනාන්තය ලෙස path එකේ යතුර සහිත ඔබේ Laravel route එක සකසා, phone number id සහ token එක dashboard එකෙන් කියවන්න. එක් අංකයකට මසකට US$ 9 සිට, අංක එකතු කරන තරමට US$ 1 දක්වා අඩු වේ, පළමු දින 3 නොමිලේ.

නිතර අසන ප්‍රශ්න

PHP SDK එකක් තිබේද?

අපෙන් නැත, අවශ්‍යත් නැත. API එක Meta ගේ ය, Meta විසින් ලේඛනගත කර ඇත, Laravel ගේ HTTP client එකට හෝ Guzzle ට එය කෙලින්ම ළඟා විය හැක.

Laravel නොමැතිව මෙය ක්‍රියා කරයිද?

ඔව්. සාමාන්‍ය PHP හිදී $_GET['hub_challenge'] කියවා, text/plain ලෙස echo කර, cURL මගින් යවන්න. යටි ඉරි රීතිය සෑම PHP framework එකකටම අදාළ වේ.

URL එකේ path එකේ යතුරක් අවශ්‍ය වන්නේ ඇයි?

මන්ද ක්‍රියා කරන සත්‍යාපනය එයයි. Meta ගේ අත්සන භාවිත කරන්නේ කිසිදා බෙදා නොගන්නා Tech Provider ගේ app secret එකයි, එබැවින් ආගන්තුකයන් ව්‍යාජ events post කිරීම වළක්වන්නේ URL රහසයි.

කණ්ඩායමට තවමත් දුරකථනය භාවිත කළ හැකිද?

ඔව්. Coexistence මගින් අංකයේ WhatsApp Business යෙදුම ක්‍රියාත්මක වේ, දුරකථනයෙන් යවන පණිවිඩ ඔබේ route එකට echo events ලෙස ලැබේ.

තවදුරටත් කියවන්න

ආරම්භ කිරීමට සූදානම්ද?

WhatsApp Coexistence මිනිත්තු කිහිපයකින් සකසන්න, මාස ගණනකින් නොව. යෙදුම දුරකථනයේ දිගටම ක්‍රියා කරයි.

නොමිලේ trial කාලය ආරම්භ කරන්න

සත්‍යාපනය කළේ

PHP සහ Laravel වෙතින් WhatsApp යවන්න