లాగిన్ చేయండిఉచిత ట్రయల్ ప్రారంభించండి
Meta Tech Provider

Supabase Edge Function లో WhatsApp వెబ్‌హుక్‌లను స్వీకరించండి

Supabase Edge Function నేరుగా నంబర్ వెబ్‌హుక్ గమ్యం కావచ్చు. ఇది Meta ధృవీకరణ GET కు hub.challenge విలువతో స్పందిస్తుంది, POST అయిన ప్రతి మెసేజ్‌ను Postgres టేబుల్‌లో చేరుస్తుంది, Cloud API ద్వారా బదులిస్తుంది. దీన్ని JWT ధృవీకరణ ఆపివేసి డిప్లాయ్ చేయండి, ఎందుకంటే Supabase డిఫాల్ట్‌గా చెల్లుబాటు అయ్యే JWT ను కోరుతుంది, Meta దాన్ని పంపలేదు.

verify_jwt = true

Edge Functions కోసం Supabase డిఫాల్ట్: మీ హ్యాండ్లర్ నడిచే ముందే, చెల్లుబాటు అయ్యే JWT లేని ప్రతి అభ్యర్థనను తిరస్కరిస్తుంది.

--no-verify-jwt

ఒక ఫంక్షన్‌కు JWT ధృవీకరణను ఆపివేసే supabase functions deploy ఫ్లాగ్.

150 s

Edge Function అభ్యర్థన ఐడిల్ టైమ్‌అవుట్. ఆ లోపు ప్రతిస్పందన రాకపోతే 504 వస్తుంది.

Edge Function ఏమి చేయాలి?

రెండు పద్ధతుల్లో రెండు పనులు.

GET లో Meta ధృవీకరణకు స్పందించాలి. క్వెరీ స్ట్రింగ్ నుంచి hub.mode, hub.verify_token, hub.challenge చదివి, టోకెన్‌ను మీరు గమ్యానికి ఇచ్చిన ధృవీకరణ టోకెన్‌తో పోల్చండి. సరిపోతే challenge ను ప్లెయిన్ టెక్స్ట్ బాడీగా స్టేటస్ 200 తో తిరిగి పంపండి. సరిపోకపోతే 403 ఇవ్వండి.

POST లో ఈవెంట్‌లను స్వీకరించాలి. బాడీని పార్స్ చేసి, entry, changes, value నుంచి మెసేజ్‌లను తీసి, టేబుల్‌లో చేర్చి, 200 ఇవ్వండి. ప్రతిస్పందన వేగంగా ఉండాలి: Meta నెమ్మదిగా వచ్చిన లేదా విఫలమైన సమాధానాన్ని విఫల డెలివరీగా భావించి మళ్లీ ప్రయత్నిస్తుంది, అంటే అదే మెసేజ్ రెండుసార్లు వస్తుంది.

EasyCoexistence లో ఫంక్షన్ 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");
});

ఫంక్షన్ Metaకు 401 ఎందుకు ఇస్తోంది?

ఎందుకంటే JWT ధృవీకరణ ఆన్‌లో ఉంది. Edge Function హ్యాండ్లర్ నడిచే ముందే Supabase Authorization హెడర్‌లోని JWT ను తనిఖీ చేస్తుంది, ఇది ప్రతి ఫంక్షన్‌కు డిఫాల్ట్. Meta అలాంటి హెడర్ పంపదు, కాబట్టి ప్లాట్‌ఫామ్ ధృవీకరణ GET ను, ప్రతి డెలివరీని తిరస్కరిస్తుంది. మీ కోడ్‌కు అవి కనిపించవు.

దీన్ని ఈ ఫంక్షన్‌కు మాత్రమే ఆపివేయండి. supabase functions deploy whatsapp --no-verify-jwt తో డిప్లాయ్ చేయండి, లేదా supabase/config.toml లో ఫంక్షన్ సెక్షన్ కింద verify_jwt = false సెట్ చేయండి. బయటి వెబ్‌హుక్ ప్రొవైడర్ పిలిచే పబ్లిక్ ఎండ్‌పాయింట్ అనే ఈ సందర్భాన్నే Supabase డాక్స్ వివరిస్తాయి.

ప్లాట్‌ఫామ్ తనిఖీ ఆపివేసిన తర్వాత ఫంక్షన్‌కు సొంత తనిఖీ కావాలి. సిగ్నేచర్ హెడర్ మీకు అందుబాటులో లేదు, ఎందుకంటే సబ్‌స్క్రిప్షన్ ఉన్న యాప్ యొక్క app secret తో Meta సంతకం చేస్తుంది. గమ్యం URL లో పొడవైన యాదృచ్ఛిక రహస్యాన్ని క్వెరీ పారామీటర్‌గా ఉంచి, అది లేని అభ్యర్థనలను తిరస్కరించండి. ఉదాహరణ POST లో అదే చేస్తుంది.

ఫంక్షన్ ఎలా నిల్వ చేసి, ఎలా బదులివ్వాలి?

ముందు నిల్వ, తర్వాత బదులు. WhatsApp మెసేజ్ id పై unique constraint తో upsert చేయండి, అప్పుడు Meta మళ్లీ ప్రయత్నించినా కొత్త డూప్లికేట్ రాకుండా అదే వరుసలో చేరుతుంది. ఒకటి కంటే ఎక్కువ నంబర్లు ఈ ఫంక్షన్‌ను చూపిస్తే, స్వీకరించిన phone_number_id ను ప్రతి వరుసలో ఉంచండి.

బదులివ్వడానికి ముందు మోడల్‌ను లేదా మరో API ను పిలవడం వంటి నెమ్మదైన పనులను EdgeRuntime.waitUntil కు అప్పగించి, వెంటనే ప్రతిస్పందన ఇవ్వండి. ఆ promise పూర్తయ్యే వరకు ఫంక్షన్ నడుస్తూనే ఉంటుంది, Meta కు మాత్రం అప్పటికే 200 అందింది. Supabase 150 సెకన్ల ఐడిల్ సమయం తర్వాత వేచి ఉండటం ఆపి 504 ఇస్తుంది. కాబట్టి స్పందించే ముందే పని మొత్తం చేసే హ్యాండ్లర్ రీట్రైలకు ఎక్కువగా కారణమవుతుంది.

బదులు మెసేజ్‌లు Cloud API మెసేజ్‌ల ఎండ్‌పాయింట్‌కు, ఫంక్షన్ సీక్రెట్‌లుగా నిల్వ చేసిన నంబర్ phone number id, టోకెన్‌తో వెళ్తాయి. కస్టమర్ చివరి మెసేజ్ నుంచి 24 గంటల్లో స్వేచ్ఛా రూప టెక్స్ట్ డెలివర్ అవుతుంది. ఆ తర్వాత ఆమోదిత టెంప్లేట్ మాత్రమే వెళ్తుంది.

ఫోన్ నుంచి పంపిన మెసేజ్‌లు ఫంక్షన్‌కు వస్తాయా?

అవును. Coexistence నంబర్‌లో WhatsApp Business యాప్ పనిచేస్తూనే ఉంటుంది. అందులోంచి ఎవరైనా బదులిచ్చినప్పుడు, ఆ అవుట్‌గోయింగ్ మెసేజ్ యొక్క ఎకోను Meta అదే గమ్యానికి డెలివర్ చేస్తుంది. అది messages లో కాకుండా smb_message_echoes ఫీల్డ్‌లో, message_echoes అరేలో వస్తుంది.

పార్సర్‌ను రెండింటినీ చదివేలా విస్తరించి, direction కాలమ్‌ను నిల్వ చేయండి. అప్పుడు టేబుల్‌లో కస్టమర్ మెసేజ్‌లు, వ్యాపార సమాధానాలు అన్నీ ఉంటాయి. తర్వాత చాలామంది క్వెరీ చేసేది ఇదే: బదులిచ్చే సమయాలు, సమాధానం లేని థ్రెడ్‌లు, ప్రతి కాంటాక్ట్‌కు చివరి ఇన్‌బౌండ్ సమయం.

ఆ చివరి విలువ ప్రతి పంపే మార్గానికీ అవసరమైన ఇన్‌పుట్ కూడా, ఎందుకంటే బదులు స్వేచ్ఛా రూప టెక్స్ట్ కావచ్చా లేక టెంప్లేట్ కావాలా అనేది అదే నిర్ణయిస్తుంది. టేబుల్ పై ఒక వ్యూ ద్వారా దాన్ని ప్రతి కాంటాక్ట్‌కు మీ మిగతా యాప్‌కు అందించవచ్చు.

సాధారణ పొరపాట్లు

  • JWT ధృవీకరణను ఆన్‌లోనే ఉంచి డిప్లాయ్ చేయడం. హ్యాండ్లర్ నడిచే ముందే Supabase, Meta అభ్యర్థనలను 401 తో తిరస్కరిస్తుంది, ఒక్క మెసేజ్ కూడా రాదు.
  • challenge ను JSON లో చుట్టి తిరిగి పంపడం. Meta కు బాడీగా ముడి విలువే కావాలి, లేకపోతే ధృవీకరణ మౌనంగా విఫలమవుతుంది.
  • స్పందించే ముందే నెమ్మదైన పని చేయడం. విఫలమైనవిగా కనిపించే వాటిని Meta మళ్లీ ప్రయత్నిస్తుంది, అదే మెసేజ్ రెండుసార్లు ప్రాసెస్ అవుతుంది.
  • సొంత తనిఖీ ఏదీ లేకుండా JWT ధృవీకరణను ఆపివేయడం. URL తెలిసిన ఎవరైనా టేబుల్‌లోకి నకిలీ మెసేజ్‌లు పంపగలరు.
EasyCoexistenceతో దీన్ని చేయడం

easycoexistence.com లో నంబర్‌ను కనెక్ట్ చేసి, వెబ్‌హుక్ గమ్యాన్ని Edge Function URL కు మీ ధృవీకరణ టోకెన్‌తో సెట్ చేయండి. phone number id, టోకెన్‌ను ఫంక్షన్ సీక్రెట్‌లుగా నిల్వ చేయండి. నంబర్‌కు నెలకు US$ 9 నుంచి, నంబర్లు పెరిగే కొద్దీ US$ 1 వరకు తగ్గుతుంది, మొదటి 3 రోజులు ఉచితం.

తరచుగా అడిగే ప్రశ్నలు

Supabase ఉచిత ప్లాన్‌లో ఇది పనిచేస్తుందా?

Edge Functions ఉచిత ప్లాన్‌లో నడుస్తాయి. అక్కడ 150 సెకన్ల వాల్ క్లాక్ పరిమితి ఉంది, చెల్లింపు ప్లాన్‌లలో 400 సెకన్లు. వేగంగా స్పందించే వెబ్‌హుక్ హ్యాండ్లర్ రెండింటి పరిమితిలోనే సులభంగా ఉంటుంది.

ఫంక్షన్‌లో service role key వాడాలా?

ఇక్కడి లాగే సర్వర్ వైపు మాత్రమే, ఫంక్షన్ environment నుంచి చదివి వాడండి. ఇది row level security ను దాటవేస్తుంది, కాబట్టి బ్రౌజర్‌కు ఎప్పుడూ చేరకూడదు.

ఒక ఫంక్షన్ అనేక నంబర్లకు సేవ చేయగలదా?

అవును. ప్రతి నంబర్ వెబ్‌హుక్ గమ్యాన్ని దాని వైపు చూపించి, ప్రతి పేలోడ్‌లోని phone_number_id ఆధారంగా శాఖలు చేయండి.

EasyCoexistence మెసేజ్‌లను చూస్తుందా?

లేదు. Meta ప్రతి వెబ్‌హుక్‌ను నేరుగా మీ ఫంక్షన్‌కు డెలివర్ చేస్తుంది, EasyCoexistence సంభాషణ కంటెంట్‌ను ఎప్పుడూ నిల్వ చేయదు.

చదవడం కొనసాగించండి

ప్రారంభించడానికి సిద్ధంగా ఉన్నారా?

నెలల్లో కాదు, నిమిషాల్లో WhatsApp Coexistence సెటప్ చేయండి. యాప్ ఫోన్‌లో పనిచేస్తూనే ఉంటుంది.

ఉచిత ట్రయల్ ప్రారంభించండి

ధృవీకరించిన తేదీ

Supabase Edge Functionsలో WhatsApp వెబ్‌హుక్‌లు