Supabase Edge Function میں WhatsApp ویب ہک وصول کریں
Supabase Edge Function براہ راست نمبر کے ویب ہک کی منزل بن سکتی ہے۔ یہ Meta کی تصدیق والی GET درخواست کا جواب hub.challenge کی قدر سے دیتی ہے، POST ہونے والے ہر میسج کو Postgres ٹیبل میں ڈالتی ہے، اور Cloud API کے ذریعے جواب بھیجتی ہے۔ اسے JWT تصدیق بند کر کے ڈیپلائے کریں، کیونکہ Supabase ڈیفالٹ طور پر درست JWT مانگتا ہے اور Meta اسے بھیج نہیں سکتا۔
Edge Functions کے لیے Supabase کا ڈیفالٹ، جو آپ کے ہینڈلر سے پہلے ہر اس درخواست کو رد کر دیتا ہے جس میں درست JWT نہ ہو۔
supabase functions deploy کا فلیگ جو کسی فنکشن کے لیے JWT تصدیق بند کرتا ہے۔
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 ڈیلیوری شروع کر دیتا ہے۔
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 تصدیق آن ہے۔ Supabase، Edge Function کا ہینڈلر چلنے سے پہلے Authorization ہیڈر میں JWT کی جانچ کرتا ہے، اور یہ ہر فنکشن کا ڈیفالٹ ہے۔ Meta ایسا کوئی ہیڈر بھیجتا ہی نہیں، اس لیے پلیٹ فارم تصدیق والی GET اور ہر ڈیلیوری کو رد کر دیتا ہے، اور آپ کا کوڈ انہیں دیکھ ہی نہیں پاتا۔
اسے صرف اس فنکشن کے لیے بند کریں۔ یا تو supabase functions deploy whatsapp --no-verify-jwt کے ساتھ ڈیپلائے کریں، یا supabase/config.toml میں فنکشن کے سیکشن کے تحت verify_jwt = false سیٹ کریں۔ Supabase کی دستاویزات بالکل اسی صورت کو بیان کرتی ہیں: بیرونی ویب ہک فراہم کنندہ کا کال کیا ہوا پبلک اینڈ پوائنٹ۔
پلیٹ فارم کی جانچ بند ہو تو فنکشن کو اپنی جانچ چاہیے۔ سگنیچر ہیڈر آپ کے کام کا نہیں، کیونکہ Meta اس ایپ کے ایپ سیکرٹ سے سائن کرتا ہے جس کی سبسکرپشن ہے۔ منزل کے URL میں ایک لمبا رینڈم سیکرٹ کوئری پیرامیٹر کے طور پر رکھیں اور اس کے بغیر آنے والی درخواستیں رد کر دیں، جیسا کہ مثال POST پر کرتی ہے۔
فنکشن کو میسج کیسے محفوظ کرنے اور جواب کیسے دینے چاہییں؟
پہلے محفوظ کریں، جواب بعد میں۔ WhatsApp میسج id پر unique constraint کے ساتھ upsert کریں، تاکہ Meta کی ری ٹرائی نئی قطار بنانے کے بجائے اسی قطار پر پڑے۔ اگر ایک سے زیادہ نمبر اس فنکشن کی طرف اشارہ کرتے ہوں تو ہر قطار میں وصول کرنے والا phone_number_id رکھیں۔
کسی بھی سست کام کے لیے، جیسے جواب سے پہلے کسی ماڈل یا دوسری API کو کال کرنا، کام EdgeRuntime.waitUntil کے حوالے کریں اور جواب فوراً لوٹا دیں۔ فنکشن اس promise کے مکمل ہونے تک چلتی رہتی ہے، جبکہ Meta کو اس کا 200 پہلے مل چکا ہوتا ہے۔ Supabase 150 سیکنڈ کی خاموش مدت کے بعد انتظار چھوڑ کر 504 لوٹاتا ہے، اس لیے جو ہینڈلر جواب دینے سے پہلے سارا کام کرے وہی سب سے زیادہ ری ٹرائی کا سبب بنتا ہے۔
جوابات Cloud API کے messages اینڈ پوائنٹ پر جاتے ہیں، نمبر کے phone number id اور ٹوکن کے ساتھ، جو فنکشن سیکرٹس میں رکھے ہوں۔ کسٹمر کے آخری میسج کے 24 گھنٹوں کے اندر آزاد متن ڈیلیور ہوتا ہے؛ اس کے بعد صرف منظور شدہ ٹیمپلیٹ چلتا ہے۔
کیا فون سے بھیجے گئے میسج فنکشن تک پہنچتے ہیں؟
جی ہاں۔ Coexistence نمبر پر WhatsApp Business ایپ کام کرتی رہتی ہے، اور جب کوئی اس سے جواب دیتا ہے تو Meta اس آؤٹ گوئنگ میسج کا echo اسی منزل پر بھیجتا ہے، messages کے بجائے smb_message_echoes فیلڈ اور message_echoes array کے تحت۔
پارسر کو بڑھائیں کہ وہ دونوں پڑھے اور direction کالم محفوظ کرے۔ تب ٹیبل میں پوری گفتگو ہوتی ہے، کسٹمر کی لائنیں بھی اور کاروبار کے جوابات بھی، اور بعد میں زیادہ تر لوگ یہی کوئری کرنا چاہتے ہیں: جواب کا وقت، بغیر جواب والے تھریڈز، ہر رابطے کا آخری ان باؤنڈ وقت۔
یہ آخری قدر ہر بھیجنے کے راستے کا ان پٹ بھی ہے، کیونکہ اسی سے طے ہوتا ہے کہ جواب آزاد متن ہو سکتا ہے یا ٹیمپلیٹ لازمی ہے۔ ٹیبل پر بنایا گیا ایک ویو اسے ہر رابطے کے لیے آپ کی باقی ایپ کو دے سکتا ہے۔
عام غلطیاں
- JWT تصدیق آن چھوڑ کر ڈیپلائے کرنا۔ Supabase ہینڈلر چلنے سے پہلے Meta کی درخواستیں 401 کے ساتھ رد کر دیتا ہے، اور کوئی میسج کبھی نہیں پہنچتا۔
- challenge کو JSON میں لپیٹ کر لوٹانا۔ Meta کو باڈی میں خام قدر چاہیے، ورنہ تصدیق خاموشی سے ناکام ہو جاتی ہے۔
- جواب دینے سے پہلے سست کام کرنا۔ Meta جسے ناکامی سمجھتا ہے اسے دوبارہ بھیجتا ہے، اور ایک ہی میسج دو بار پروسیس ہوتا ہے۔
- اپنی کسی جانچ کے بغیر JWT تصدیق بند کر دینا۔ URL ڈھونڈنے والا کوئی بھی شخص ٹیبل میں جعلی میسج ڈال سکتا ہے۔
easycoexistence.com پر نمبر جوڑیں، اس کے ویب ہک کی منزل کو اپنے ویریفائی ٹوکن کے ساتھ Edge Function کے URL پر سیٹ کریں، اور phone number id اور ٹوکن کو فنکشن سیکرٹس میں رکھیں۔ US$ 9 فی نمبر ماہانہ سے شروع، نمبر بڑھنے کے ساتھ US$ 1 تک، اور پہلے 3 دن فری ٹرائل۔
اکثر پوچھے جانے والے سوالات
کیا یہ Supabase کے فری پلان پر چلتا ہے؟
Edge Functions فری پلان پر چلتے ہیں، جہاں وال کلاک حد 150 سیکنڈ ہے اور پیڈ پلانز پر 400 سیکنڈ۔ تیزی سے جواب دینے والا ویب ہک ہینڈلر دونوں حدوں سے بہت پہلے مکمل ہو جاتا ہے۔
کیا فنکشن میں service role key استعمال کروں؟
صرف سرور سائیڈ پر، جیسا کہ یہاں ہے، فنکشن کے ماحول سے پڑھ کر۔ یہ row level security کو بائی پاس کرتی ہے، اس لیے یہ کبھی براؤزر تک نہیں پہنچنی چاہیے۔
کیا ایک فنکشن کئی نمبروں کو سنبھال سکتی ہے؟
جی ہاں۔ ہر نمبر کے ویب ہک کی منزل اسی کی طرف رکھیں اور ہر پے لوڈ کے phone_number_id کے مطابق الگ الگ کارروائی کریں۔
کیا EasyCoexistence میسج دیکھ سکتا ہے؟
نہیں۔ Meta ہر ویب ہک سیدھا آپ کے فنکشن تک پہنچاتا ہے، اور EasyCoexistence گفتگو کا مواد کبھی محفوظ نہیں کرتا۔
مزید پڑھیں
شروع کرنے کے لیے تیار ہیں؟
WhatsApp Coexistence چند منٹ میں سیٹ اپ کریں، مہینوں میں نہیں۔ ایپ فون پر کام کرتی رہتی ہے۔
فری ٹرائل شروع کریںتصدیق شدہ تاریخ