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

Supabase Edge Function-இல் WhatsApp வெப்ஹூக்களைப் பெறுவது

Supabase Edge Function-ஐ நேரடியாக எண்ணின் வெப்ஹூக் இலக்காக வைக்கலாம். Meta-வின் சரிபார்ப்பு GET கோரிக்கைக்கு hub.challenge மதிப்புடன் அது பதிலளிக்கும், POST செய்யப்படும் ஒவ்வொரு மெசேஜையும் Postgres அட்டவணையில் சேர்க்கும், Cloud API வழியே பதிலும் அனுப்பும். JWT சரிபார்ப்பை முடக்கி deploy செய்யுங்கள். ஏனெனில் Supabase இயல்பாகவே செல்லுபடியாகும் JWT கேட்கும், Meta அதை அனுப்ப முடியாது.

verify_jwt = true

Supabase-இன் Edge Function-களுக்கான இயல்புநிலை: உங்கள் ஹேண்ட்லர் இயங்குவதற்கு முன்பே, செல்லுபடியாகும் JWT இல்லாத எந்தக் கோரிக்கையையும் நிராகரிக்கும்.

--no-verify-jwt

ஒரு function-க்கு JWT சரிபார்ப்பை முடக்கும் supabase functions deploy ஃப்ளாக்.

150 s

Edge Function-க்கான கோரிக்கை செயலற்ற நேர வரம்பு; அதற்குள் பதில் இல்லையெனில் 504 திரும்பும்.

Edge Function என்ன செய்ய வேண்டும்?

இரண்டு முறைகளில் இரண்டு வேலைகள்.

GET கோரிக்கையில் Meta-வின் சரிபார்ப்புக்குப் பதிலளிக்க வேண்டும். query string-இலிருந்து hub.mode, hub.verify_token, hub.challenge ஆகியவற்றைப் படியுங்கள். இலக்கின் வெரிஃபை டோக்கனாக நீங்கள் உள்ளிட்ட மதிப்புடன் ஒப்பிடுங்கள். பொருந்தினால் challenge மதிப்பை plain text உடலாக 200 ஸ்டேட்டஸுடன் திருப்புங்கள். டோக்கன் பொருந்தவில்லை என்றால் 403 திருப்புங்கள்.

POST கோரிக்கையில் நிகழ்வுகளைப் பெற வேண்டும். உடலை parse செய்து, entry, changes, value ஆகியவற்றிலிருந்து மெசேஜ்களை எடுத்து, அட்டவணையில் சேர்த்து, 200 திருப்புங்கள். பதிலை விரைவாக வைத்திருங்கள். மெதுவான அல்லது தோல்வியடைந்த பதிலை Meta தோல்வியுற்ற டெலிவரியாகக் கருதி மீண்டும் முயல்கிறது, அதனால் அதே மெசேஜ் இரண்டு முறை வரும்.

EasyCoexistence-இல் function-இன் URL-ஐ எண்ணின் வெப்ஹூக் இலக்காக, அதே வெரிஃபை டோக்கனுடன் அமையுங்கள். Meta டெலிவரி செய்யத் தொடங்கும்.

supabase/functions/whatsapp/index.ts
import { createClient } from "npm:@supabase/supabase-js@2";

const db = createClient(Deno.env.get("SUPABASE_URL")!, Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!);

Deno.serve(async (req) => {
  const url = new URL(req.url);
  if (req.method === "GET") {
    const ok = url.searchParams.get("hub.verify_token") === Deno.env.get("VERIFY_TOKEN");
    return new Response(ok ? url.searchParams.get("hub.challenge") : "forbidden", { status: ok ? 200 : 403 });
  }
  if (url.searchParams.get("key") !== Deno.env.get("URL_SECRET")) return new Response("no", { status: 401 });
  const body = await req.json();
  const rows = (body.entry ?? []).flatMap((e: any) => e.changes ?? [])
    .flatMap((c: any) => (c.value?.messages ?? []).map((m: any) => ({
      wamid: m.id, sender: m.from, kind: m.type, text: m.text?.body ?? null,
      phone_number_id: c.value.metadata?.phone_number_id, raw: m,
    })));
  if (rows.length) await db.from("whatsapp_messages").upsert(rows, { onConflict: "wamid" });
  return new Response("ok");
});

Function ஏன் Meta-வுக்கு 401 திருப்புகிறது?

JWT சரிபார்ப்பு இயக்கத்தில் இருப்பதால். Edge Function-இன் ஹேண்ட்லர் இயங்குவதற்கு முன்பே Authorization header-இல் உள்ள JWT-ஐ Supabase சரிபார்க்கும், இது ஒவ்வொரு function-க்கும் இயல்புநிலை. Meta அத்தகைய header-ஐ அனுப்பாது. எனவே தளமே சரிபார்ப்பு GET-ஐயும் ஒவ்வொரு டெலிவரியையும் நிராகரிக்கிறது, உங்கள் குறியீடு அவற்றைப் பார்க்கவே இல்லை.

இந்த function-க்கு மட்டும் அதை முடக்குங்கள். supabase functions deploy whatsapp --no-verify-jwt என deploy செய்யுங்கள், அல்லது supabase/config.toml-இல் function-இன் பகுதியில் verify_jwt = false என அமையுங்கள். வெளி வெப்ஹூக் வழங்குநர் அழைக்கும் பொது எண்ட்பாயிண்ட் என்ற இதே சூழ்நிலையை Supabase ஆவணங்கள் விவரிக்கின்றன.

தளச் சரிபார்ப்பு நீக்கப்பட்ட பிறகு, function-க்கு சொந்தச் சரிபார்ப்பு தேவை. signature header உங்களுக்குக் கிடைக்காது, ஏனெனில் சந்தாவுக்குச் சொந்தமான ஆப்பின் app secret கொண்டு Meta கையொப்பமிடுகிறது. இலக்கு URL-இல் நீண்ட சீரற்ற ரகசியத்தை query parameter ஆகச் சேர்த்து, அது இல்லாத கோரிக்கைகளை நிராகரியுங்கள். எடுத்துக்காட்டில் POST-இல் அப்படித்தான் செய்யப்பட்டுள்ளது.

Function எப்படிச் சேமித்துப் பதிலளிக்க வேண்டும்?

முதலில் சேமியுங்கள், பிறகு பதிலளியுங்கள். WhatsApp மெசேஜ் id மீது unique constraint வைத்து upsert செய்யுங்கள். அப்போது Meta-வின் மறுமுயற்சிகள் புதிய வரியை உருவாக்காமல் அதே வரியிலேயே சேரும். ஒன்றுக்கு மேற்பட்ட எண்கள் function-ஐ நோக்கி இருந்தால், பெறும் phone_number_id-ஐ ஒவ்வொரு வரியிலும் வைத்திருங்கள்.

பதிலளிக்கும் முன் மாடலை அல்லது வேறு API-ஐ அழைப்பது போன்ற மெதுவான வேலைகளை EdgeRuntime.waitUntil-க்கு ஒப்படைத்து, உடனே பதிலைத் திருப்புங்கள். அந்த promise முடியும் வரை function தொடர்ந்து இயங்கும், Meta-வுக்கோ ஏற்கெனவே 200 கிடைத்துவிட்டது. Supabase 150 வினாடி செயலற்ற நேரத்தில் காத்திருப்பதை நிறுத்தி 504 திருப்பும். எனவே பதிலளிக்கும் முன் எல்லா வேலையையும் செய்யும் ஹேண்ட்லரே மறுமுயற்சிகளுக்கு அதிக வாய்ப்புள்ளது.

பதில்கள் Cloud API-இன் messages எண்ட்பாயிண்ட்டுக்குச் செல்லும். எண்ணின் phone number id-ஐயும் டோக்கனையும் function secrets ஆகச் சேமித்துப் பயன்படுத்துங்கள். வாடிக்கையாளரின் கடைசி மெசேஜிலிருந்து 24 மணி நேரத்துக்குள் ஃப்ரீ டெக்ஸ்ட் செல்லும். அதற்குப் பிறகு அங்கீகரிக்கப்பட்ட டெம்ப்ளேட் மட்டுமே செல்லும்.

தொலைபேசியிலிருந்து அனுப்பிய மெசேஜ்கள் function-க்கு வருமா?

ஆம். Coexistence எண்ணில் WhatsApp Business ஆப் தொடர்ந்து செயல்படும். அதிலிருந்து யாராவது பதிலளிக்கும்போது, அந்த வெளிச்செல்லும் மெசேஜின் எதிரொலியை Meta அதே இலக்குக்கு அனுப்பும். அது messages-இல் அல்ல, smb_message_echoes புலத்தின் கீழ் message_echoes array-இல் வரும்.

இரண்டையும் படிக்குமாறு parser-ஐ விரிவாக்கி, direction நெடுவரிசையையும் சேமியுங்கள். அப்போது அட்டவணையில் வாடிக்கையாளரின் வரிகளும் வணிகத்தின் பதில்களும் என முழு உரையாடல் இருக்கும். பதில் நேரங்கள், பதிலளிக்கப்படாத உரையாடல்கள், ஒவ்வொரு தொடர்புக்கும் கடைசி உள்வரும் நேரம் போன்றவற்றை அதில் வினவலாம்.

அந்தக் கடைசி மதிப்பு ஒவ்வொரு அனுப்பும் வழிக்கும் தேவையான உள்ளீடும் ஆகும். ஏனெனில் பதில் ஃப்ரீ டெக்ஸ்ட்டாக இருக்கலாமா அல்லது டெம்ப்ளேட் தேவையா என்பதை அதுவே தீர்மானிக்கிறது. அட்டவணையின் மீது ஒரு view அமைத்து, உங்கள் ஆப்பின் மற்ற பகுதிகளுக்காக அதை ஒவ்வொரு தொடர்புக்கும் வழங்கலாம்.

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

  • JWT சரிபார்ப்பை இயக்கத்திலேயே விட்டு deploy செய்வது. ஹேண்ட்லர் இயங்குவதற்கு முன்பே Supabase, Meta-வின் கோரிக்கைகளை 401 உடன் நிராகரிக்கும், ஒரு மெசேஜ் கூட வராது.
  • challenge மதிப்பை JSON-இல் சுற்றித் திருப்புவது. Meta-வுக்கு உடலாக மூல மதிப்பு தேவை, இல்லையெனில் சரிபார்ப்பு அமைதியாகத் தோல்வியடையும்.
  • பதிலளிக்கும் முன் மெதுவான வேலையைச் செய்வது. தோல்வி எனக் கருதப்படுவதை Meta மீண்டும் முயலும், அதே மெசேஜ் இரண்டு முறை செயலாக்கப்படும்.
  • சொந்தச் சரிபார்ப்பு எதுவும் இல்லாமல் JWT சரிபார்ப்பை முடக்குவது. URL-ஐக் கண்டறியும் எவரும் அட்டவணையில் போலி மெசேஜ்களை அனுப்ப முடியும்.
EasyCoexistence மூலம் இதைச் செய்வது

easycoexistence.com-இல் எண்ணை இணையுங்கள், அதன் வெப்ஹூக் இலக்காக Edge Function-இன் URL-ஐ உங்கள் வெரிஃபை டோக்கனுடன் அமையுங்கள், phone number id-ஐயும் டோக்கனையும் function secrets ஆகச் சேமியுங்கள். ஒரு எண்ணுக்கு மாதம் US$ 9 முதல், எண்கள் கூடும்போது US$ 1 வரை குறையும். முதல் 3 நாட்கள் இலவசம்.

அடிக்கடி கேட்கப்படும் கேள்விகள்

Supabase இலவசத் திட்டத்தில் இது வேலை செய்யுமா?

Edge Function-கள் இலவசத் திட்டத்திலும் இயங்கும். அங்கு wall clock வரம்பு 150 வினாடிகள், கட்டணத் திட்டங்களில் 400 வினாடிகள். விரைவாகப் பதிலளிக்கும் வெப்ஹூக் ஹேண்ட்லர் இரண்டு வரம்புகளுக்கும் மிகவும் உள்ளேயே இருக்கும்.

Function-இல் service role key-ஐப் பயன்படுத்தலாமா?

இங்கே உள்ளது போல சர்வர் பக்கத்தில் மட்டும், function-இன் environment-இலிருந்து படித்துப் பயன்படுத்துங்கள். இது row level security-ஐத் தாண்டிவிடும், எனவே உலாவிக்கு ஒருபோதும் செல்லக்கூடாது.

ஒரே function பல எண்களுக்குச் சேவை செய்ய முடியுமா?

முடியும். ஒவ்வொரு எண்ணின் வெப்ஹூக் இலக்கையும் அதை நோக்கி அமைத்து, ஒவ்வொரு பேலோடிலும் உள்ள phone_number_id அடிப்படையில் பிரித்துக் கையாளுங்கள்.

EasyCoexistence மெசேஜ்களைப் பார்க்குமா?

இல்லை. ஒவ்வொரு வெப்ஹூக்கையும் Meta நேரடியாக உங்கள் function-க்கு அனுப்புகிறது. EasyCoexistence உரையாடல் உள்ளடக்கத்தை ஒருபோதும் சேமிப்பதில்லை.

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

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

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

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

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

Supabase Edge Functions-இல் WhatsApp வெப்ஹூக்கள்