உள்நுழைஇலவசமாகத் தொடங்குங்கள்
Meta Tech Provider

PHP மற்றும் Laravel-இல் WhatsApp மெசேஜ்களை அனுப்புங்கள், பெறுங்கள்

மெசேஜ்களைப் பெற ஒரு Laravel ரூட் போதும். அது Meta-வின் சரிபார்ப்பு GET கோரிக்கைக்குப் பதிலளித்து, POST கோரிக்கைகளை ஏற்கும். PHP புள்ளிகளை அண்டர்ஸ்கோராக மாற்றுவதால், அளவுருக்கள் hub_mode, hub_verify_token, hub_challenge என்று படிக்கப்படும். அனுப்ப, Cloud API-இன் messages எண்ட்பாயிண்ட்டுக்கு எண்ணின் phone_number_id மற்றும் டோக்கனுடன் ஒரே Http::withToken() POST போதும். SDK தேவையில்லை.

hub_challenge

உள்வரும் மாறிப் பெயர்களில் உள்ள புள்ளிகளை PHP அண்டர்ஸ்கோராக மாற்றும். அதனால் hub.challenge என்பது hub_challenge என்று படிக்கப்படும்.

routes/api.php

install:api உருவாக்கும் Laravel-இன் stateless API ரூட்கள் /api கீழ் இயங்கும். அவை web குழுவின் CSRF பாதுகாப்புக்கு வெளியே இருக்கும்.

v25.0

POST /{phone-number-id}/messages என்ற அழைப்புக்கு, Meta-வின் தற்போதைய மெசேஜ் அனுப்பும் எடுத்துக்காட்டுகளில் உள்ள Graph API பதிப்பைப் பயன்படுத்துங்கள்.

Laravel-இல் WhatsApp மெசேஜ்களை எப்படிப் பெறுவது?

routes/api.php கோப்பில் ஒரே பாதையில் ஒரு GET மற்றும் ஒரு POST வைத்து. அந்தக் கோப்பு இல்லையென்றால் முதலில் php artisan install:api இயக்குங்கள். API ரூட்கள் stateless ஆனவை, web குழுவுக்கு வெளியே இருப்பவை. அதனால் routes/web.php-இல் நடப்பது போல, CSRF டோக்கன் இல்லை என்று 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, பேலோடை ஒரு queue ஜாப்பிடம் ஒப்படைத்து உடனே 200 திருப்பும். பாதையில் நீளமான சீரற்ற ஒரு key வைத்து, இரண்டு ரூட்களிலும் அதைச் சரிபாருங்கள். Meta, Tech Provider-இன் app secret கொண்டு கையொப்பமிடுவதால், கையொப்ப ஹெடரை உங்கள் பக்கத்தில் சரிபார்க்க முடியாது.

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`-க்கான messages எண்ட்பாயிண்ட்டுக்கு ஒரு POST, அக்சஸ் டோக்கனை பேரர் டோக்கனாக வைத்து. இரு மதிப்புகளும் இணைப்பிலிருந்து வருகின்றன. அவை டாஷ்போர்டில் தெரியும், get_api_credentials திருப்பியும் தரும். அவற்றைக் குறியீட்டில் வைக்காமல், சூழல் மாறிகளின் துணையுடன் config/services.php-இல் வையுங்கள்.

கோரிக்கையின் உடல் வடிவம் நேரத்தைப் பொறுத்தது. வாடிக்கையாளரின் கடைசி மெசேஜிலிருந்து 24 மணி நேரத்துக்குள் text ஆப்ஜெக்ட் வேலை செய்யும். அந்தச் சாளரத்துக்கு வெளியே, அங்கீகரிக்கப்பட்ட டெம்ப்ளேட்டையும் அதன் மொழியையும் குறிப்பிடும் டெம்ப்ளேட் ஆப்ஜெக்டை மட்டுமே Meta ஏற்கும். ஃப்ரீ டெக்ஸ்ட் பிழை 131047-உடன் தோல்வியடையும். பதிலில் அதைப் பார்க்கலாம்: தோல்வியடைந்த அழைப்பு, என்ன தவறு என்று சொல்லும் code கொண்ட error ஆப்ஜெக்டைத் திருப்பும். அதை நிராகரிக்காமல் log செய்யுங்கள்.

கோரிக்கையில் 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', []));
}

இதற்கு மேல் ஒரு production Laravel ஹேண்ட்லருக்கு என்ன தேவை?

உண்மையான queue, நகல் நீக்கம், மற்றும் சாளரச் சரிபார்ப்பு.

Meta மெதுவான பதிலை மீண்டும் முயற்சிப்பதால் queue முக்கியம். queue இணைப்பு உண்மையானதாகவும், worker இயங்குவதாகவும் இருந்தால் மட்டுமே HandleWhatsAppEvent::dispatch() விரைவாகத் திரும்பும். sync டிரைவரில் ஜாப் கோரிக்கைக்குள்ளேயே இயங்கும். மெதுவான மாடல் அழைப்பு அல்லது டேட்டாபேஸ் எழுதுதல் நகல் டெலிவரியாக மாறும்.

மெசேஜ் ஐடியின் அடிப்படையில், அதாவது ஒவ்வொரு மெசேஜிலும் உள்ள wamid-இன் அடிப்படையில் நகல்களை நீக்குங்கள். மறுமுயற்சிகள் அசாதாரணமானவை அல்ல, வழக்கமானவை. அந்த நெடுவரிசையில் unique index அல்லது அதன் மீது அமைந்த cache lock போதும்.

மேலும் ஒவ்வொரு தொடர்பும் கடைசியாக எப்போது எழுதினார் என்பதைச் சேமியுங்கள். அந்த நேரமுத்திரை இருந்தால், வாடிக்கையாளர் ஏற்கனவே காத்திருந்த பிறகு பிழை 131047 மூலம் தெரிந்துகொள்வதற்குப் பதிலாக, அனுப்பும் பகுதி தானாகவே text அல்லது டெம்ப்ளேட்டைத் தேர்ந்தெடுக்கும். WhatsApp Business ஆப்பில் போனில் தட்டச்சு செய்த பதில்கள் அதே ரூட்டில் echo நிகழ்வுகளாக வரும். எனவே உரையாடலை ஒருவர் கையில் எடுத்ததையும் ஹேண்ட்லரால் பார்க்க முடியும்.

பொதுவான தவறுகள்

  • hub.challenge-ஐ புள்ளியுடன் படிப்பது. PHP அதை hub_challenge என்று மாற்றிவிட்டது, அதனால் ஹேண்ட்லர் வெற்று உடலைத் திருப்பும், Meta ஒருபோதும் சரிபார்க்காது.
  • வெப்ஹூக்கை routes/web.php-இல் வைப்பது. Meta-வின் POST-இல் CSRF டோக்கன் இல்லை, அதனால் 419 உடன் நிராகரிக்கப்படும்.
  • sync queue-க்கு dispatch செய்வது. 200-க்கு முன்பே ஜாப் இயங்கும், மெதுவான செயலாக்கம் மீண்டும் முயற்சிக்கப்படும், மெசேஜ்கள் இரண்டு முறை செயலாக்கப்படும்.
  • challenge-ஐ response()->json() மூலம் திருப்புவது. மதிப்பைச் சுற்றியுள்ள மேற்கோள் குறிகள் Meta-வின் சரிபார்ப்பைத் தோல்வியடையச் செய்யும்.
EasyCoexistence மூலம் இதைச் செய்வது

easycoexistence.com-இல் எண்ணை இணையுங்கள், வெப்ஹூக் இலக்காக உங்கள் Laravel ரூட்டை அதன் key பாதையில் இருக்குமாறு அமையுங்கள், டாஷ்போர்டிலிருந்து `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 பாதையில் ஏன் ஒரு key தேவை?

ஏனெனில் வேலை செய்யும் அங்கீகாரம் அதுதான். Meta-வின் கையொப்பம் Tech Provider-இன் app secret-ஐப் பயன்படுத்துகிறது, அது ஒருபோதும் பகிரப்படாது. எனவே போலி நிகழ்வுகளை அந்நியர்கள் அனுப்பாமல் தடுப்பது URL-இல் உள்ள ரகசியம்தான்.

குழு இன்னும் போனைப் பயன்படுத்த முடியுமா?

ஆம். Coexistence எண்ணில் WhatsApp Business ஆப்பைத் தொடர்ந்து இயங்க வைக்கிறது. போனிலிருந்து அனுப்பிய மெசேஜ்கள் உங்கள் ரூட்டுக்கு echo நிகழ்வுகளாக வரும்.

தொடர்ந்து படிக்கவும்

தொடங்கத் தயாரா?

மாதங்கள் ஆகாமல், சில நிமிடங்களில் WhatsApp Coexistence-ஐ அமைக்குங்கள். ஆப்ஸ் போனில் தொடர்ந்து இயங்கும்.

இலவச ட்ரையலைத் தொடங்குங்கள்

இதில் சரிபார்க்கப்பட்டது:

PHP, Laravel-இல் WhatsApp மெசேஜ் அனுப்புதல்