IngiaAnza kipindi cha majaribio bila malipo
Meta Tech Provider

Tuma na pokea WhatsApp kutoka PHP na Laravel

Kupokea ni route ya Laravel inayojibu GET ya uthibitishaji ya Meta na kukubali POST, ikisoma vigezo kama hub_mode, hub_verify_token na hub_challenge kwa sababu PHP hubadilisha nukta kuwa mistari chini. Kutuma ni POST moja ya Http::withToken() kwenda endpoint ya `/messages` ya Cloud API, ikiwa na phone number id na token ya nambari hiyo. Hakuna SDK inayohitajika.

hub_challenge

PHP hubadilisha nukta kuwa mistari chini katika majina ya vigezo vinavyoingia, kwa hiyo hub.challenge husomwa kama hub_challenge.

routes/api.php

API route za Laravel zisizo na hali (stateless), zinazoundwa na install:api, hutolewa chini ya /api na ziko nje ya ulinzi wa CSRF wa kundi la web.

v25.0

Toleo la Graph API katika mifano ya sasa ya Meta ya kutuma ujumbe, kwenye POST /{phone-number-id}/messages.

Unapokeaje jumbe za WhatsApp katika Laravel?

Tumia GET na POST kwenye njia moja katika routes/api.php. Endesha php artisan install:api kwanza ikiwa faili hiyo haipo. API route hazina hali (stateless) na ziko nje ya kundi la web, kwa hiyo POST ya Meta haikataliwi kwa kukosa token ya CSRF, jambo linalotokea kwenye route ya routes/web.php.

GET hujibu uthibitishaji wa Meta. Meta hutuma hub.mode, hub.verify_token na hub.challenge, lakini PHP hubadilisha nukta kuwa mistari chini katika majina ya vigezo vinavyoingia, kwa hiyo Laravel huona hub_mode, hub_verify_token na hub_challenge. Msimbo unaosoma majina yenye nukta hupata null na haithibitishi kamwe. Rudisha challenge kama maandishi ya kawaida, si kupitia response()->json().

POST hukabidhi payload kwa job iliyo kwenye queue na kurudisha 200 mara moja. Weka ufunguo mrefu wa nasibu kwenye njia na uukague kwenye route zote mbili: Meta husaini uwasilishaji kwa app secret ya Tech Provider, kwa hiyo saini ya header haiwezi kuthibitishwa upande wako.

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);
});

Unatumaje ujumbe wa WhatsApp kutoka Laravel?

Tumia HTTP client ya Laravel: POST moja kwenda endpoint ya `/messages` ya phone number id, ukitumia access token kama bearer token. Thamani zote mbili hutoka kwenye muunganisho, huonyeshwa kwenye dashboard na hurudishwa na get_api_credentials, na zinapaswa kuwekwa katika config/services.php zikitegemea environment variables badala ya kuwa ndani ya msimbo.

Umbo la body hutegemea wakati. Ndani ya saa 24 tangu ujumbe wa mwisho wa mteja, object ya `text` hufanya kazi, kama ilivyo hapa chini. Nje ya dirisha hilo la huduma kwa wateja, Meta hukubali tu object ya `template` inayotaja template iliyoidhinishwa na lugha yake, na maandishi huru hushindwa kwa hitilafu 131047. Jibu ndilo mahali pa kuliona: ombi lililoshindwa hurudisha object ya hitilafu ambayo msimbo wake unaeleza kilichoharibika, kwa hiyo liandike kwenye log badala ya kulitupa.

Hakuna kitu katika ombi hili kinachohusu EasyCoexistence pekee. Ni ombi lile lile lililo kwenye nyaraka za Meta, kwa hiyo HTTP client yoyote ya PHP, Guzzle au cURL ya kawaida, hufanya kazi kwa njia ile ile.

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

Handler ya Laravel ya production inahitaji nini zaidi ya hapo?

Queue halisi, uondoaji wa nakala, na ukaguzi wa dirisha.

Queue ni muhimu kwa sababu Meta hurudia kutuma ikiwa jibu ni la polepole. HandleWhatsAppEvent::dispatch() hurudi haraka tu pale muunganisho wa queue ni halisi na worker anaendesha. Kwenye sync driver, job huendeshwa ndani ya ombi lenyewe, na simu ya model ya polepole au uandishi kwenye database husababisha uwasilishaji wa nakala.

Ondoa nakala kwa kutumia kitambulisho cha ujumbe, yaani wamid katika kila ujumbe, kwa sababu kurudiwa ni jambo la kawaida, si la kipekee. Unique index kwenye safu hiyo, au cache lock yenye ufunguo huo, inatosha.

Na hifadhi wakati kila mwasiliani alipoandika mara ya mwisho. Kwa muhuri huo wa wakati, njia ya kutuma huchagua text au template yenyewe, badala ya kugundua kupitia hitilafu 131047 baada ya mteja kuwa tayari anasubiri. Majibu yanayoandikwa kwenye simu katika programu ya WhatsApp Business hufika kama echo events kwenye route ile ile, kwa hiyo handler pia inaweza kuona wakati mtu amechukua mazungumzo.

Makosa ya kawaida

  • Kusoma hub.challenge kwa nukta. PHP imeibadilisha kuwa hub_challenge, kwa hiyo handler hurudisha body tupu na Meta haithibitishi kamwe.
  • Kuweka webhook kwenye routes/web.php. POST ya Meta haina token ya CSRF na hukataliwa kwa 419.
  • Kutuma job kwenye sync queue. Job huendeshwa kabla ya 200, ushughulikiaji wa polepole hurudiwa, na jumbe huchakatwa mara mbili.
  • Kurudisha challenge kwa response()->json(). Alama za nukuu kuzunguka thamani hushindwa kwenye ukaguzi wa Meta.
Kufanya hili ukitumia EasyCoexistence

Unganisha nambari yako kwenye easycoexistence.com, weka mahali pa webhook kuwa route yako ya Laravel yenye ufunguo kwenye njia, kisha soma phone number id na token kwenye dashboard. Kuanzia US$ 9 kwa kila nambari kwa mwezi, hadi US$ 1 kadiri unavyoongeza nambari, na siku 3 za kwanza bila malipo.

Maswali yanayoulizwa mara kwa mara

Je, kuna SDK ya PHP?

Si kutoka kwetu, na haihitajiki. API ni ya Meta, imeandikwa na Meta, na HTTP client ya Laravel au Guzzle huifikia moja kwa moja.

Je, hii inafanya kazi bila Laravel?

Ndiyo. Katika PHP ya kawaida soma $_GET['hub_challenge'], iirudishe kama text/plain, na utume kwa cURL. Kanuni ya mistari chini inatumika kwa kila framework ya PHP.

Kwa nini URL inahitaji ufunguo kwenye njia?

Kwa sababu ndiyo njia ya uthibitishaji inayofanya kazi. Saini ya Meta hutumia app secret ya Tech Provider, ambayo haishirikiwi kamwe, kwa hiyo siri ya URL ndiyo inayowazuia wageni kutuma events bandia.

Je, timu bado inaweza kutumia simu?

Ndiyo. Coexistence huweka programu ya WhatsApp Business ikifanya kazi kwenye nambari hiyo, na jumbe zinazotumwa kutoka kwenye simu hufika kwenye route yako kama echo events.

Endelea kusoma

Uko tayari kuanza?

Sanidi WhatsApp Coexistence kwa dakika chache, si miezi. Programu inaendelea kufanya kazi kwenye simu.

Anza kipindi cha majaribio bila malipo

Imethibitishwa kwenye

Tuma WhatsApp kutoka PHP na Laravel