שליחה וקבלה של WhatsApp ב-Node.js
קבלה מתבצעת בנתיב שעונה לבקשת GET לאימות של Meta ומקבל בקשות POST. שליחה מתבצעת בקריאת fetch אל ה-Cloud API, עם phone number id ואסימון גישה (Access Token). אין לנו SDK ואין צורך להתקין דבר.
בקשת GET לאימות של Meta ובקשת POST לאירועים.
החלון שאחרי הודעת לקוח שבו אפשר לשלוח טקסט חופשי.
השגיאה שמתקבלת כששולחים טקסט חופשי מחוץ לחלון.
איך מקבלים הודעות ב-Node?
נתיב אחד עם שתי שיטות, ב-Express, ב-Fastify, ב-handler של נתיב Next או בשרת רגיל.
ה-GET עונה לאימות של Meta: קוראים את hub.mode, hub.verify_token ו-hub.challenge מהשאילתה, משווים את האסימון לאסימון שלכם ומחזירים את האתגר כטקסט רגיל. החזרה כ-JSON היא הטעות הנפוצה, והיא יוצרת נקודת קצה שלא מקבלת דבר אף שהיא נראית תקינה.
ה-POST מקבל אירועים. מחזירים 200 מיד ומעבדים אחר כך. Meta מנסה שוב כל דבר איטי, ומטפל שמבצע את העבודה לפני התגובה יקבל את אותה הודעה יותר מפעם אחת. במיוחד בשרת ללא שרת קבוע, החזרה ראשונה והכנסת העבודה לתור מונעות מהפעלה קרה ליצור כפילות.
איך שולחים?
קריאת fetch אל נקודת הקצה messages של ה-Cloud API עבור phone number id, עם האסימון בכותרת bearer.
שום דבר כאן אינו ייחודי לנו, לכן הבקשה תואמת בדיוק לתיעוד של Meta ואין מעטפת שצריך ללמוד או להינעל אליה. שני הערכים נמצאים בלוח הבקרה, ו-get_api_credentials מחזיר אותם דרך מחבר MCP אם עוזר מבצע את החיבור.
גוף הבקשה תלוי בתזמון. בתוך 24 שעות מההודעה הנכנסת האחרונה של הלקוח, שולחים אובייקט טקסט. מחוץ לחלון הזה, שולחים אובייקט תבנית עם שם תבנית מאושר ושפה. קוד ששולח רק טקסט עובר כל בדיקה ונכשל בהודעה הראשונה שמגיעה במהלך הלילה.
מה שונה בשרת ללא שרת קבוע?
שני דברים, ושניהם קשורים לכך שהפונקציה מסתיימת לפני שהעבודה מסתיימת.
החזרת 200 והמשך העיבוד אחר כך לא שורדים פונקציה שקופאת ברגע שהיא מחזירה תגובה. השתמשו במה שהפלטפורמה שלכם מציעה כדי להשאיר את העבודה פעילה אחרי התגובה, או הכניסו את ה-payload לתור ותנו לפונקציה נפרדת לטפל בו. Meta זקוקה לאישור מהיר, לא לסיום העבודה.
הפעלות קרות גם הופכות תגובות איטיות לסבירות יותר, כלומר יש יותר ניסיונות חוזרים ויותר כפילויות. מניעת כפילויות לפי מזהה ההודעה wamid אינה אפשרות במבנה הזה, אלא מה שהופך אותו לאמין.
טעויות נפוצות
- החזרת האתגר כ-JSON במקום כגוף הגולמי.
- ביצוע העבודה לפני החזרת 200. בשרת ללא שרת קבוע, הפונקציה עלולה לקפוא ברגע שהיא מחזירה תגובה.
- דילוג על מניעת כפילויות. Meta מנסה שוב בכוונה, וכפילויות הן מצב רגיל ולא מקרה קצה.
מחברים את המספר ב-easycoexistence.com, מגדירים את יעד הוובהוק (Webhook) לנתיב שלכם וקוראים את phone number id ואת האסימון מלוח הבקרה. המחיר מתחיל ב-US$ 9 למספר בחודש ויורד ל-US$ 2 בנפח, עם 7 ימי ניסיון חינם.
שאלות נפוצות
האם צריך ספרייה?
לא. נתיב ו-fetch מספיקים, והשיחה תואמת בדיוק לתיעוד של Meta.
האם זה עובד ב-Vercel או ב-Lambda?
כן, עם הסתייגות רגילה של שרת ללא שרת קבוע: מאשרים קודם, ואז מעבדים דרך תור או מנגנון רקע ולא בתוך הבקשה.
איך מוודאים שהבקשה הגיעה מ-Meta?
בודקים את כותרת החתימה מול סוד האפליקציה. כדאי לעשות זאת ברגע שנקודת הקצה הופכת לציבורית.
אפשר להשתמש ב-TypeScript?
כן. אין מה להגדיר מולנו, כי ה-payload שייך ל-Meta ומתועד על ידה.
המשיכו לקרוא
מוכנים להתחיל?
מגדירים WhatsApp Coexistence בתוך דקות, לא חודשים. האפליקציה ממשיכה לעבוד בטלפון.
התחילו תקופת ניסיון בחינםנבדק ב-