लग इननिःशुल्क ट्रायल सुरु गर्नुहोस्
Meta Tech Provider

PHP र Laravel बाट WhatsApp पठाउनुहोस् र प्राप्त गर्नुहोस्

म्यासेज प्राप्त गर्न Laravel रुटले Meta को प्रमाणीकरण GET लाई जवाफ दिन्छ र POST स्वीकार्छ। PHP ले डटलाई अन्डरस्कोरमा बदल्ने भएकाले प्यारामिटर hub_mode, hub_verify_token र hub_challenge को रूपमा पढिन्छ। पठाउन phone_number_id र टोकनसहित Cloud API को messages एन्डपोइन्टमा एउटा 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 रुटहरू स्टेटलेस हुन् र वेब समूहबाहिर पर्छन्, त्यसैले 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 ले पेलोडलाई क्यूमा राखिएको जबमा सुम्पन्छ र तुरुन्तै 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 को messages एन्डपोइन्टमा एउटा POST, एक्सेस टोकनलाई बेयरर टोकनका रूपमा राखेर। दुवै मान कनेक्सनबाट आउँछन्, ड्यासबोर्डमा देखिन्छन् र get_api_credentials ले फर्काउँछ। तिनलाई कोडमा होइन, वातावरण भेरिएबलमा आधारित config/services.php मा राख्नुपर्छ।

बडीको आकार समयमा भर पर्छ। ग्राहकको अन्तिम म्यासेजको 24 घण्टाभित्र तल देखाइएझैं text अब्जेक्ट चल्छ। त्यो विन्डोबाहिर Meta ले स्वीकृत टेम्प्लेट र त्यसको भाषा उल्लेख गरेको template अब्जेक्ट मात्र स्वीकार गर्छ, र स्वतन्त्र टेक्स्ट त्रुटि 131047 सहित असफल हुन्छ। यो प्रतिक्रियामा देखिन्छ: असफल कलले त्रुटि अब्जेक्ट फर्काउँछ जसको कोडले के बिग्रियो भन्ने बताउँछ, त्यसैले त्यसलाई फ्याँक्नुको सट्टा लग गर्नुहोस्।

अनुरोधमा EasyCoexistence विशेष केही छैन। यो Meta आफ्नै डकुमेन्टेसनमा भएको कल हो, त्यसैले Guzzle वा सादा cURL जस्ता जुनसुकै PHP HTTP क्लाइन्टले उस्तै काम गर्छ।

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 बाट थाहा पाउनुको सट्टा, पठाउने बाटोले आफैं text वा टेम्प्लेट छान्छ। 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 रुट राख्नुहोस्, र ड्यासबोर्डबाट phone_number_id र टोकन पढ्नुहोस्। प्रति नम्बर प्रति महिना US$ 9 देखि सुरु हुन्छ, नम्बर थप्दै जाँदा US$ 1 सम्म घट्छ, र पहिलो 7 दिन ट्रायल निःशुल्क छ।

बारम्बार सोधिने प्रश्नहरू

के 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 पठाउनुहोस्