පුරනය වන්නනොමිලේ trial කාලය ආරම්භ කරන්න
Meta Tech Provider

Supabase Edge Function එකක WhatsApp webhooks ලබා ගැනීම

Supabase Edge Function එකකට අංකයේ webhook ගමනාන්තය ලෙස කෙළින්ම කටයුතු කළ හැකිය. එය Meta ගේ සත්‍යාපන GET request එකට hub.challenge අගය සමඟ පිළිතුරු දෙයි, POST කරන ලද සෑම පණිවිඩයක්ම Postgres table එකකට ඇතුළත් කරයි, සහ Cloud API හරහා පිළිතුරු යවයි. එය JWT සත්‍යාපනය අක්‍රිය කර deploy කරන්න, මන්ද Supabase පෙරනිමියෙන් වලංගු JWT එකක් ඉල්ලයි, Meta ට එය යැවිය නොහැක.

verify_jwt = true

Edge Functions සඳහා Supabase ගේ පෙරනිමිය. වලංගු JWT එකක් නැති සෑම request එකක්ම ඔබේ handler එක ක්‍රියාත්මක වීමට පෙර ප්‍රතික්ෂේප කරයි.

--no-verify-jwt

function එකක් සඳහා JWT සත්‍යාපනය අක්‍රිය කරන supabase functions deploy flag එක.

150 s

Edge Function එකක request idle timeout කාලය. ඒ වන විට ප්‍රතිචාරයක් නොලැබුණහොත් 504 ලැබේ.

Edge Function එක කළ යුත්තේ කුමක්ද?

method දෙකක් මත කරුණු දෙකක්.

GET මත, එය Meta ගේ සත්‍යාපනයට පිළිතුරු දෙයි. query string එකෙන් hub.mode, hub.verify_token සහ hub.challenge කියවන්න, token එක ගමනාන්තයේ verify token එක ලෙස ඔබ ඇතුළත් කළ අගය සමඟ සසඳන්න, සහ challenge අගය plain text body එකක් ලෙස status 200 සමඟ ආපසු දෙන්න. token එක නොගැළපේ නම් 403 ආපසු දෙන්න.

POST මත, එය events ලබා ගනී. body එක parse කර, entry, changes සහ value තුළින් පණිවිඩ ලබාගෙන, table එකකට ඇතුළත් කර, 200 ආපසු දෙන්න. ප්‍රතිචාරය වේගවත්ව තබන්න: Meta මන්දගාමී හෝ අසාර්ථක පිළිතුරක් අසාර්ථක බෙදාහැරීමක් ලෙස සලකා නැවත උත්සාහ කරයි, එනම් එකම පණිවිඩය දෙවරක් ලැබේ.

EasyCoexistence හි අංකයේ webhook ගමනාන්තය ලෙස function එකේ URL එක, එම verify token එකම සමඟ සකසන්න. එවිට 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 එකක handler එක ක්‍රියාත්මක වීමට පෙර Supabase විසින් Authorization header එකේ JWT එකක් වලංගු දැයි පරීක්ෂා කරයි, සහ එය සෑම function එකකටම පෙරනිමියයි. Meta එවැනි header එකක් යවන්නේ නැත, ඒ නිසා platform එක සත්‍යාපන GET එකත් සෑම බෙදාහැරීමත් ප්‍රතික්ෂේප කරයි, ඔබේ කේතයට ඒවා කිසිදා නොපෙනේ.

මෙම function එක සඳහා පමණක් එය අක්‍රිය කරන්න. එක්කෝ supabase functions deploy whatsapp --no-verify-jwt ලෙස deploy කරන්න, නැතහොත් supabase/config.toml හි function එකේ කොටස යටතේ verify_jwt = false සකසන්න. Supabase ගේ ලේඛනවල විස්තර කරන්නේ හරියටම මෙම අවස්ථාවයි: පිටත webhook සපයන්නෙකු ඇමතිය යුතු පොදු endpoint එකක්.

platform පරීක්ෂාව අක්‍රිය කළ පසු, function එකට තමන්ගේම පරීක්ෂාවක් අවශ්‍යයි. signature header එක ඔබට ලබාගත නොහැක, මන්ද Meta අත්සන් කරන්නේ subscription එකට හිමිකම් කියන යෙදුමේ app secret එකෙනි. ගමනාන්ත URL එකේ query parameter එකක් ලෙස දිගු random රහසක් දමා, එය නැති requests ප්‍රතික්ෂේප කරන්න, උදාහරණයේ POST මත කරන ආකාරයටම.

function එක ගබඩා කර පිළිතුරු දිය යුත්තේ කෙසේද?

පළමුව ගබඩා කරන්න, පසුව පිළිතුරු දෙන්න. WhatsApp පණිවිඩ id එක මත unique constraint එකක් සමඟ upsert කරන්න, එවිට Meta ගේ නැවත උත්සාහයන් අනුපිටපතක් සෑදීම වෙනුවට එකම පේළියට පැමිණේ. function එකට එක් අංකයකට වඩා යොමු වේ නම්, සෑම පේළියකම ලැබූ phone_number_id එක තබා ගන්න.

පිළිතුරු දීමට පෙර model එකක් හෝ වෙනත් API එකක් ඇමතීම වැනි මන්දගාමී කටයුත්තකදී, වැඩය EdgeRuntime.waitUntil වෙත භාර දී ප්‍රතිචාරය වහාම ආපසු දෙන්න. ඒ promise එක සම්පූර්ණ වන තෙක් function එක දිගටම ක්‍රියාත්මක වන අතර, Meta ට දැනටමත් එහි 200 ලැබී ඇත. Supabase idle කාලය තත්පර 150 කදී බලා සිටීම නවතා 504 ආපසු දෙයි, ඒ නිසා ප්‍රතිචාර දීමට පෙර සියලු වැඩ කරන handler එක නැවත උත්සාහයන්ට වඩාත් ඉඩ ඇති එකයි.

පිළිතුරු යන්නේ Cloud API හි පණිවිඩ යැවීමේ endpoint එකටයි, function secrets ලෙස ගබඩා කළ අංකයේ phone_number_id සහ token එක සමඟ. පාරිභෝගිකයාගේ අවසාන පණිවිඩයෙන් පැය 24 ක් ඇතුළත නිදහස් පෙළ බෙදා හැරේ, ඉන් පිටත අනුමත template එකක් පමණක් බෙදා හැරේ.

දුරකථනයෙන් යවන පණිවිඩ function එකට ලැබේද?

ඔව්. Coexistence අංකයක WhatsApp Business යෙදුම දිගටම ක්‍රියා කරයි, සහ යමෙකු එයින් පිළිතුරු දුන් විට Meta එම පිටතට යන පණිවිඩයේ echo එකක් එම ගමනාන්තයටම බෙදා හරියි, messages වෙනුවට smb_message_echoes field එක සහ message_echoes array එක යටතේ.

දෙකම කියවීමට parser එක දිගු කර direction column එකක් ගබඩා කරන්න. එවිට table එකේ සම්පූර්ණ සංවාදය තිබේ, පාරිභෝගිකයාගේ පණිවිඩ සහ ව්‍යාපාරයේ පිළිතුරු, පසුව බොහෝ දෙනා විමසීමට කැමති දේ වන්නේ ඒවාය: පිළිතුරු කාලය, පිළිතුරු නොලැබූ සංවාද, සම්බන්ධතාවයක් අනුව අවසන් inbound වේලාව.

එම අවසාන අගය සෑම යැවීමේ මාර්ගයකටම අවශ්‍ය ආදානයද වේ, මන්ද පිළිතුර නිදහස් පෙළක් විය හැකිද නැතහොත් template එකක් විය යුතුද යන්න තීරණය කරන්නේ එයයි. table එක මත view එකක් මඟින් ඔබේ යෙදුමේ අනෙක් කොටස් සඳහා එය සම්බන්ධතාවයක් අනුව ලබා දිය හැක.

සාමාන්‍ය වැරදි

  • JWT සත්‍යාපනය සක්‍රිය කර තබා deploy කිරීම. Supabase විසින් handler එක ක්‍රියාත්මක වීමට පෙර Meta ගේ requests 401 සමඟ ප්‍රතික්ෂේප කරයි, එවිට කිසිදු පණිවිඩයක් නොලැබේ.
  • challenge අගය JSON තුළ ඔතා ආපසු දීම. Meta ට අවශ්‍ය වන්නේ raw අගය body එක ලෙසයි, නැතහොත් සත්‍යාපනය නිහඬව අසාර්ථක වේ.
  • ප්‍රතිචාර දීමට පෙර මන්දගාමී වැඩ කිරීම. Meta අසාර්ථක යැයි දකින දේ නැවත උත්සාහ කරයි, එවිට එකම පණිවිඩය දෙවරක් සැකසේ.
  • ඔබේම පරීක්ෂාවක් නොමැතිව JWT සත්‍යාපනය අක්‍රිය කිරීම. URL එක සොයාගන්නා ඕනෑම කෙනෙකුට table එකට ව්‍යාජ පණිවිඩ post කළ හැක.
EasyCoexistence සමඟ මෙය කිරීම

easycoexistence.com හි අංකය සම්බන්ධ කර, එහි webhook ගමනාන්තය Edge Function එකේ URL එකට ඔබේ verify token එක සමඟ සකසන්න, සහ phone_number_id සහ token එක function secrets ලෙස ගබඩා කරන්න. සම්බන්ධ කළ අංකයකට මසකට US$ 9 සිට, අංක එකතු කරන විට US$ 1 දක්වා පහත වැටේ, පළමු දින 3 නොමිලේ trial කාලයකි.

නිතර අසන ප්‍රශ්න

මෙය Supabase නොමිලේ සැලසුමේ ක්‍රියා කරයිද?

Edge Functions නොමිලේ සැලසුමේ ක්‍රියා කරයි, wall clock සීමාව තත්පර 150 කි, ගෙවන සැලසුම්වල තත්පර 400 ට එරෙහිව. වේගයෙන් ප්‍රතිචාර දක්වන webhook handler එකක් එම දෙකේම සීමාවට වඩා බොහෝ ඉහළින් පවතී.

function එකේ service role key එක භාවිතා කළ යුතුද?

මෙහි මෙන් server පැත්තේ පමණක්, function එකේ environment එකෙන් කියවා. එය row level security මග හරින නිසා කිසිදා browser එකකට ළඟා නොවිය යුතුය.

එක function එකකට අංක කිහිපයකට සේවය කළ හැකිද?

ඔව්. සෑම අංකයකම webhook ගමනාන්තය එයට යොමු කර, සෑම payload එකකම phone_number_id අනුව ශාඛා කරන්න.

EasyCoexistence ට පණිවිඩ පෙනේද?

නැත. Meta සෑම webhook එකක්ම කෙළින්ම ඔබේ function එකට බෙදා හරියි, සහ EasyCoexistence කිසිදා සංවාද අන්තර්ගතය ගබඩා නොකරයි.

තවදුරටත් කියවන්න

ආරම්භ කිරීමට සූදානම්ද?

WhatsApp Coexistence මිනිත්තු කිහිපයකින් සකසන්න, මාස ගණනකින් නොව. යෙදුම දුරකථනයේ දිගටම ක්‍රියා කරයි.

නොමිලේ trial කාලය ආරම්භ කරන්න

සත්‍යාපනය කළේ

Supabase Edge Functions හි WhatsApp webhooks