Supabase Edge Function मध्ये WhatsApp वेबहुक मिळवा
Supabase Edge Function थेट नंबरचे वेबहुक गंतव्य होऊ शकते. ती Meta च्या पडताळणीच्या GET विनंतीला hub.challenge व्हॅल्यूसह उत्तर देते, POST होणारा प्रत्येक मेसेज Postgres टेबलमध्ये घालते आणि Cloud API मधून उत्तर पाठवते. ती JWT पडताळणी बंद करून डिप्लॉय करा, कारण Supabase डिफॉल्टने वैध JWT मागते आणि Meta ते पाठवू शकत नाही.
Edge Functions साठी Supabase चा डिफॉल्ट: तुमचा हँडलर चालण्यापूर्वीच वैध JWT नसलेली प्रत्येक विनंती नाकारली जाते.
फंक्शनसाठी JWT पडताळणी बंद करणारा supabase functions deploy फ्लॅग.
Edge Function साठी विनंतीची आयडल टाइमआउट मर्यादा; तोपर्यंत प्रतिसाद न मिळाल्यास 504 येतो.
Edge Function ने काय करायला हवे?
दोन गोष्टी, दोन मेथडवर.
GET वर ती Meta ची पडताळणी पूर्ण करते. क्वेरी स्ट्रिंगमधून hub.mode, hub.verify_token आणि hub.challenge वाचा, टोकनची तुलना गंतव्य सेट करताना टाकलेल्या verify token शी करा आणि challenge प्लेन टेक्स्ट बॉडी म्हणून स्टेटस 200 सह परत करा. टोकन जुळत नसेल तर 403 परत करा.
POST वर ती इव्हेंट्स स्वीकारते. बॉडी पार्स करा, entry, changes आणि value मधून मेसेज काढा, ते टेबलमध्ये घाला आणि 200 परत करा. प्रतिसाद जलद ठेवा: Meta ला उशीर झालेला किंवा अयशस्वी प्रतिसाद म्हणजे डिलिव्हरी अयशस्वी वाटते आणि ते पुन्हा प्रयत्न करते, म्हणजे तोच मेसेज दोनदा येतो.
EasyCoexistence मध्ये फंक्शनचा URL त्याच verify token सह नंबरचे वेबहुक गंतव्य म्हणून सेट करा, की 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 पडताळणी चालू आहे. Edge Function चा हँडलर चालण्यापूर्वी Supabase Authorization हेडरमधील JWT तपासते, आणि हा प्रत्येक फंक्शनसाठी डिफॉल्ट आहे. Meta असे हेडर पाठवत नाही, त्यामुळे प्लॅटफॉर्म पडताळणीचा GET आणि प्रत्येक डिलिव्हरी नाकारतो, आणि तुमचा कोड त्या कधी पाहतच नाही.
हे फक्त याच फंक्शनसाठी बंद करा. एकतर supabase functions deploy whatsapp --no-verify-jwt ने डिप्लॉय करा, किंवा supabase/config.toml मधील फंक्शनच्या विभागात verify_jwt = false सेट करा. Supabase च्या डॉक्समध्ये नेमकी हीच स्थिती आहे: बाहेरील वेबहुक प्रोव्हायडरने कॉल केलेला सार्वजनिक एंडपॉइंट.
प्लॅटफॉर्मची तपासणी बंद असताना फंक्शनला स्वतःची तपासणी हवी. सिग्नेचर हेडर तुम्हाला उपलब्ध नाही, कारण Meta सबस्क्रिप्शनची मालकी असलेल्या ॲपच्या app secret ने सही करते. गंतव्य URL मध्ये क्वेरी पॅरामीटर म्हणून एक लांब यादृच्छिक सीक्रेट ठेवा आणि ते नसलेल्या विनंत्या नाकारा, जसे उदाहरणात POST वर केले आहे.
फंक्शनने साठवणूक आणि उत्तर कसे हाताळावे?
आधी साठवा, नंतर उत्तर द्या. WhatsApp मेसेज id वर युनिक कन्स्ट्रेंटसह upsert करा, म्हणजे Meta चे पुन्हा प्रयत्न डुप्लिकेट तयार न करता त्याच रो वर येतात. एकापेक्षा जास्त नंबर फंक्शनकडे येत असतील तर प्रत्येक रो मध्ये मेसेज स्वीकारणारा phone_number_id ठेवा.
जे काम संथ आहे, जसे उत्तर देण्यापूर्वी मॉडेल किंवा दुसरी एपीआय कॉल करणे, ते EdgeRuntime.waitUntil कडे द्या आणि प्रतिसाद लगेच परत करा. तो promise पूर्ण होईपर्यंत फंक्शन चालू राहते, तर Meta ला आधीच 200 मिळालेला असतो. Supabase 150 सेकंद आयडल राहिल्यावर थांबते आणि 504 परत करते, म्हणून प्रतिसाद देण्यापूर्वी सर्व काम करणारा हँडलर सर्वात जास्त पुन्हा प्रयत्न घडवतो.
उत्तरे Cloud API च्या messages एंडपॉइंटला जातात, नंबरच्या 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.com वर नंबर कनेक्ट करा, त्याचे वेबहुक गंतव्य तुमच्या verify token सह 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 काही मिनिटांत सेट करा, काही महिन्यांत नाही. ॲप फोनवर काम करत राहते.
मोफत ट्रायल सुरू करापडताळले: