Webhooks ของ Meta สำหรับแพลตฟอร์ม Messenger |
Webhooks ของ Meta ช่วยให้คุณได้รับการแจ้งเตือน HTTP แบบเรียลไทม์เกี่ยวกับการเปลี่ยนแปลงอ็อบเจ็กต์บางรายการในกราฟสังคมของ Meta ตัวอย่างเช่น เราสามารถส่งการแจ้งเตือนถึงคุณเมื่อมีผู้ใช้ส่งข้อความถึงเพจ Facebook หรือบัญชีมืออาชีพบน Instagram ของคุณ การแจ้งเตือน Webhooks ช่วยให้คุณสามารถติดตามข้อความที่เข้ามาและการอัพเดตสถานะของข้อความได้ ซึ่งการแจ้งเตือน Webhooks ช่วยให้คุณสามารถหลีกเลี่ยงขีดจำกัดอัตราที่จะเกิดขึ้นหากคุณสืบค้นตำแหน่งข้อมูลของแพลตฟอร์ม Messenger เพื่อติดตามการเปลี่ยนแปลงเหล่านี้
หากต้องการใช้ Webhooks สำหรับการสนทนาใน Messenger หรือ Instagram ได้อย่างประสบความสำเร็จ คุณจะต้องดำเนินการดังนี้
ก่อนเริ่มต้น เราถือว่าคุณได้ทำสิ่งต่อไปนี้แล้ว
เซิร์ฟเวอร์ของคุณต้องสามารถประมวลคำขอ HTTPS ได้ 2 ประเภท ได้แก่ คำขอให้ตรวจสอบยืนยันและการแจ้งเตือนเหตุการณ์ เนื่องจากคำขอทั้ง 2 ประเภทนี้ใช้ HTTPS เซิร์ฟเวอร์ของคุณจึงต้องมีการกำหนดค่าและติดตั้งใบรับรอง TLS หรือ SSL ที่ใช้งานได้ไว้อย่างถูกต้อง โดยระบบจะไม่รองรับใบรับรองที่ลงนามเอง
ส่วนด้านล่างนี้จะอธิบายสิ่งที่จะอยู่ในคำขอแต่ละประเภทและวิธีตอบกลับคำขอเหล่านั้น
ตัวอย่างโค้ดที่แสดงในที่นี้นำมาจากแอพตัวอย่างที่อยู่ใน GitHub โปรดไปที่ GitHub เพื่อดูตัวอย่างที่ครบถ้วนสมบูรณ์และข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าเซิร์ฟเวอร์ Webhooks ของคุณ
หากต้องการสร้างตำแหน่งข้อมูลเพื่อรับการแจ้งเตือน Webhooks จากแพลตฟอร์ม Messenger ไฟล์ app.js
อาจมีลักษณะดังนี้
// Create the endpoint for your webhook app.post("/webhook", (req, res) => { let body = req.body; console.log(`\u{1F7EA} Received webhook:`); console.dir(body, { depth: null }); ...
โค้ดนี้จะสร้างตำแหน่งข้อมูล /webhook
ที่ยอมรับคำขอ POST
และตรวจสอบว่าคำขอนั้นเป็นการแจ้งเตือนจาก Webhook
200 OK
ตำแหน่งข้อมูลนี้ต้องส่งคืนการตอบกลับเป็น 200OK
ที่จะบอกแพลตฟอร์ม Messenger ว่าได้รับเหตุการณ์แล้วและไม่จำเป็นต้องส่งซ้ำ ซึ่งโดยปกติ คุณจะไม่ส่งการตอบกลับนี้จนกว่าการประมวลผลการแจ้งเตือนเสร็จสิ้นแล้ว
ตำแหน่งข้อมูลของคุณควรตอบกลับการแจ้งเตือนทั้งหมด:
200 OK HTTPS
โค้ดต่อไปนี้จะอยู่ใน app.post
ในไฟล์ app.js
ของคุณ และอาจมีลักษณะดังนี้
... // Send a 200 OK response if this is a page webhook if (body.object === "page") { // Returns a '200 OK' response to all requests res.status(200).send("EVENT_RECEIVED"); ... // Determine which webhooks were triggered and get sender PSIDs and locale, message content and more. ... } else { // Return a '404 Not Found' if event is not from a page subscription res.sendStatus(404); } });
ทุกครั้งที่คุณกำหนดค่าผลิตภัณฑ์ Webhooks ในแดชบอร์ดของแอพ เราจะส่งคำขอ GET
ไปที่ URL ตำแหน่งข้อมูลของคุณ คำขอให้ตรวจสอบยืนยันจะมีพารามิเตอร์สตริงสืบค้นต่อไปนี้ ซึ่งอยู่ต่อท้าย URL ตำแหน่งข้อมูลของคุณ โดยจะมีลักษณะดังนี้
GET https://www.your-clever-domain-name.com/webhooks? hub.mode=subscribe& hub.verify_token=mytoken& hub.challenge=1158201444
ตำแหน่งข้อมูลของคุณต้องดำเนินการต่อไปนี้ เมื่อใดก็ตามที่ได้รับคำขอให้ตรวจสอบยืนยัน
hub.verify_token
ตรงกับสตริงที่คุณตั้งค่าไว้ในช่อง "โทเค็นการตรวจสอบยืนยัน" เมื่อคุณกำหนดค่าผลิตภัณฑ์ Webhooks ในแดชบอร์ดของแอพ (คุณยังไม่ได้ตั้งค่าสตริงโทเค็นนี้)hub.challenge
ไฟล์ app.js
ของคุณอาจมีลักษณะดังนี้
// Add support for GET requests to our webhook app.get("/messaging-webhook", (req, res) => { // Parse the query params let mode = req.query["hub.mode"]; let token = req.query["hub.verify_token"]; let challenge = req.query["hub.challenge"]; // Check if a token and mode is in the query string of the request if (mode && token) { // Check the mode and token sent is correct if (mode === "subscribe" && token === config.verifyToken) { // Respond with the challenge token from the request console.log("WEBHOOK_VERIFIED"); res.status(200).send(challenge); } else { // Respond with '403 Forbidden' if verify tokens do not match res.sendStatus(403); } } });
พารามิเตอร์ | ตัวอย่างค่า | คำอธิบาย |
---|---|---|
|
| ระบบจะตั้งค่านี้เป็น |
|
|
|
|
| สตริงที่เราดึงมาจากช่อง "โทเค็นการตรวจสอบยืนยัน" ในแดชบอร์ดของแอพในแอพของคุณ เราจะตั้งค่าสตริงนี้เมื่อคุณดำเนินขั้นตอนการตั้งค่าการกำหนดค่า Webhooks เสร็จสมบูรณ์แล้ว |
หมายเหตุ: PHP จะแปลงจุด (.) เป็นขีดล่าง (_) ในชื่อพารามิเตอร์
หากคุณอยู่ในแดชบอร์ดของแอพและกำลังกำหนดค่าผลิตภัณฑ์ Webhooks ของคุณ (และทริกเกอร์คำขอให้ตรวจสอบยืนยัน) แดชบอร์ดจะระบุว่าตำแหน่งข้อมูลของคุณตรวจสอบคำขออย่างถูกต้องหรือไม่ API จะตอบกลับเพื่อระบุว่าสำเร็จหรือล้มเหลว หากคุณใช้ตำแหน่งข้อมูล /app/subscriptions
ของ API กราฟเพื่อกำหนดค่าผลิตภัณฑ์ Webhooks
เมื่อคุณกำหนดค่าผลิตภัณฑ์ Webhooks คุณจะต้องสมัครรับข้อมูลจาก fields
ที่เฉพาะเจาะจงในประเภท object
(เช่น ช่อง messages
บนอ็อบเจ็กต์ page
) เมื่อใดก็ตามที่มีการเปลี่ยนแปลงในช่องใดช่องหนึ่ง เราจะส่งคำขอ POST
ไปที่ตำแหน่งข้อมูลของคุณโดยมีเพย์โหลด JSON ที่อธิบายการเปลี่ยนแปลงดังกล่าว
ตัวอย่างเช่น หากคุณสมัครรับข้อมูลจากช่อง message_reactions
ของอ็อบเจ็กต์ page
และลูกค้าได้แสดงความรู้สึกกับข้อความที่แอพของคุณส่ง เราจะส่งคำขอ POST
ให้คุณซึ่งจะมีลักษณะดังนี้
{
"object":"page",
"entry":[
{
"id":"<PAGE_ID>",
"time":1458692752478,
"messaging":[
{
"sender":{
"id":"<PSID>"
},
"recipient":{
"id":"<PAGE_ID>"
},
...
}
]
}
]
}
เพย์โหลดจะมีอ็อบเจ็กต์ที่อธิบายการเปลี่ยนแปลง เมื่อคุณกำหนดค่าผลิตภัณฑ์ Webhooks คุณจะสามารถระบุได้ว่าเพย์โหลดควรมีเฉพาะชื่อของช่องที่เปลี่ยนแปลงหรือไม่ หรือเพย์โหลดควรรวมค่าใหม่ไว้ด้วยหรือไม่
เราจัดรูปแบบเพย์โหลดทั้งหมดด้วย JSON ดังนั้น คุณจึงสามารถแยกวิเคราะห์เพย์โหลดโดยใช้วิธีการหรือแพ็คเกจการแยกวิเคราะห์ JSON ทั่วไปได้
เราจะไม่จัดเก็บข้อมูลการแจ้งเตือนเหตุการณ์ของ Webhook ที่เราส่งให้คุณ ดังนั้นอย่าลืมบันทึกและจัดเก็บเนื้อหาเพย์โหลดที่คุณต้องการเก็บไว้
เราลงนามเพย์โหลด "การแจ้งเตือนเหตุการณ์" ทั้งหมดด้วยลายเซ็น SHA256 และรวมลายเซ็นไว้ในส่วนหัว "X-Hub-Signature-256" ของคำขอ ซึ่งนำหน้าด้วย "sha256=" ทั้งนี้แม้คุณจะไม่ต้องตรวจสอบความถูกต้องของเพย์โหลด แต่ก็เป็นสิ่งที่คุณควรทำและเราขอแนะนำให้ทำเช่นกัน
วิธีตรวจสอบความถูกต้องของเพย์โหลดมีดังนี้
X-Hub-Signature-256
(ทุกอย่างที่อยู่หลัง sha256=
) หากลายเซ็นตรงกัน แสดงว่าเพย์โหลดเป็นของแท้โปรดทราบว่าเราสร้างลายเซ็นโดยใช้ Unicode เวอร์ชั่นอักขระหลีกของเพย์โหลด โดยเป็นเลขฐานสิบหกตัวพิมพ์เล็ก หากคุณคำนวณลายเซ็นกับไบต์ที่ถอดรหัส คุณจะได้ลายเซ็นที่แตกต่างออกไป ตัวอย่างเช่น สตริง äöå
ควรเป็นอักขระหลีกโดยเป็น \u00e4\u00f6\u00e5
ไฟล์ app.js
อาจมีลักษณะดังนี้
// Import dependencies and set up http server const express = require("express"), bodyParser = require("body-parser"), { urlencoded, json } = require("body-parser"), app = express().use(bodyParser.json()); ... // Verify that the callback came from Facebook. function verifyRequestSignature(req, res, buf) { var signature = req.headers["x-hub-signature-256"]; if (!signature) { console.warn(`Couldn't find "x-hub-signature-256" in headers.`); } else { var elements = signature.split("="); var signatureHash = elements[1]; var expectedHash = crypto .createHmac("sha256", config.appSecret) .update(buf) .digest("hex"); if (signatureHash != expectedHash) { throw new Error("Couldn't validate the request signature."); } } }
หากการแจ้งเตือนที่ส่งมายังเซิร์ฟเวอร์ของคุณไม่สำเร็จ เราจะลองอีก 2-3 ครั้งในทันที เซิร์ฟเวอร์ของคุณควรจัดการเรื่องการลบข้อมูลซ้ำซ้อนในกรณีเหล่านี้ หากเรายังคงไม่สามารถส่งการแจ้งเตือนได้หลังผ่านไปแล้ว 15 นาที จะมีการส่งการแจ้งเตือนไปยังบัญชีผู้พัฒนาของคุณ
หากส่งการแจ้งเตือนไม่สำเร็จต่อเนื่องถึง 1 ชั่วโมง คุณจะได้รับการแจ้งเตือน "ปิดใช้งาน Webhooks แล้ว" และแอพของคุณจะยกเลิกการสมัครรับข้อมูล Webhooks สำหรับเพจหรือบัญชีมืออาชีพบน Instagram เมื่อคุณแก้ไขปัญหาดังกล่าวแล้ว คุณจะต้องสมัครรับข้อมูล Webhooks อีกครั้ง
หากต้องการทดสอบการตรวจสอบยืนยัน Webhook ให้เรียกใช้คำขอ cURL ต่อไปนี้ด้วยโทเค็นการตรวจสอบยืนยันของคุณ
curl -X GET "localhost:1337/webhook?hub.verify_token=YOUR-VERIFY-TOKEN&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
หากการตรวจสอบยืนยัน Webhook ของคุณทำงานได้อย่างที่ควรจะเป็น คุณควรเห็นดังต่อไปนี้
WEBHOOK_VERIFIED
ลงบันทึกในบรรทัดคำสั่งที่การประมวลผลโหนดของคุณกำลังดำเนินอยู่CHALLENGE_ACCEPTED
ลงบันทึกในบรรทัดคำสั่งที่คุณส่งคำขอ cURLหากต้องการทดสอบ Webhook ของคุณ ให้ส่งคำขอ cURL ดังต่อไปนี้
curl -H "Content-Type: application/json" -X POST "localhost:1337/webhook" -d '{"object": "page", "entry": [{"messaging": [{"message": "TEST_MESSAGE"}]}]}'
หาก Webhook ของคุณทำงานได้อย่างที่ควรจะเป็น คุณควรเห็นดังต่อไปนี้
TEST_MESSAGE
ที่ลงบันทึกในบรรทัดคำสั่งที่การประมวลผลโหนดของคุณกำลังดำเนินอยู่EVENT RECEIVED
ที่ลงบันทึกในบรรทัดคำสั่งที่คุณส่งคำขอ cURLเมื่อตำแหน่งข้อมูลเซิร์ฟเวอร์ Webhooks หรือแอพตัวอย่างของคุณพร้อมแล้ว ให้ไปที่แดชบอร์ดของแอพ ของแอพคุณเพื่อสมัครรับข้อมูล Webhooks ของ Meta
ในตัวอย่างนี้ เราจะใช้แดชบอร์ดเพื่อกำหนดค่า Webhook และสมัครรับข้อมูลจากช่อง messages
ซึ่งทุกครั้งที่ลูกค้าส่งข้อความมาที่แอพของคุณ ระบบจะส่งการแจ้งเตือนไปยังตำแหน่งข้อมูล Webhooks ของคุณ
ป้อน URL ของตำแหน่งข้อมูลของคุณลงในช่อง URL การเรียกกลับ และเพิ่มโทเค็นการตรวจสอบยืนยันของคุณลงในช่องโทเค็นการตรวจสอบยืนยัน เราจะรวมสตริงนี้ไว้ในคำขอให้ตรวจสอบยืนยันทั้งหมด หากคุณกำลังใช้หนึ่งในแอพตัวอย่างของเรา สตริงนี้ควรเป็นสตริงเดียวกับที่คุณใช้สำหรับตัวแปรการกำหนดค่า TOKEN
ของแอพคุณ
ขั้นตอนสุดท้ายคือการสมัครรับข้อมูลแต่ละช่อง สมัครรับข้อมูลจากช่อง messages
และส่ง "การแจ้งเตือนเหตุการณ์" ขั้นทดสอบ
หากตำแหน่งข้อมูลของคุณได้รับการตั้งค่าอย่างถูกต้อง ตำแหน่งข้อมูลของคุณควรตรวจสอบความถูกต้องของเพย์โหลดและดำเนินการตามโค้ดใดก็ตามที่คุณตั้งไว้เมื่อตรวจสอบเสร็จเรียบร้อย หากคุณกำลังใช้แอพตัวอย่างของเรา ให้โหลด URL ของแอพในเว็บเบราว์เซอร์ของคุณ โดยระบบควรแสดงเนื้อหาของเพย์โหลด
คุณสามารถเปลี่ยนการสมัครรับข้อมูล Webhooks, โทเค็นการตรวจสอบยืนยัน หรือเวอร์ชั่นของ API ได้ตลอดเวลาโดยใช้แดชบอร์ดของแอพ
หมายเหตุ: เราขอแนะนำให้คุณใช้ API เวอร์ชั่นล่าสุดเพื่อรับข้อมูลทั้งหมดที่มีสำหรับ Webhook แต่ละรายการ
นอกจากนี้ คุณยังสามารถดำเนินการดังกล่าวได้โดยใช้โปรแกรมโดยใช้ตำแหน่งข้อมูล /app/subscriptions
เหตุการณ์ Webhooks | คำอธิบาย |
---|---|
| ลงทะเบียนเหตุการณ์ข้อความที่ได้รับ |
| ลงทะเบียนเหตุการณ์การเชื่อมโยงบัญชีผู้ใช้ |
| ลงทะเบียนเหตุการณ์การอัพเดตการชำระเงิน |
| ลงทะเบียนเหตุการณ์ข้อความที่ส่ง |
| ลงทะเบียนเหตุการณ์เอคโคข้อความ |
| ลงทะเบียนเหตุการณ์เกมทันใจ |
| ลงทะเบียนเหตุการณ์โปรโตคอลการส่งมอบ |
| สมัครใช้งานเหตุการณ์การรับปลั๊กอิน |
| ลงทะเบียนเหตุการณ์การชำระเงิน |
| ลงทะเบียนเหตุการณ์การบังคับใช้นโยบาย |
| ลงทะเบียนเหตุการณ์โพสต์ย้อนกลับที่ได้รับ |
| |
| ลงทะเบียนเหตุการณ์อ่านข้อความแล้ว |
| ลงทะเบียนเหตุการณ์การอ้างอิง |
|
คุณจะต้องเชื่อมต่อแอพ Webhooks กับเพจของคุณ และให้เพจของคุณสมัครรับข้อมูลเพื่อรับการแจ้งเตือน Webhooks ที่คุณต้องการรับ
คุณสามารถเชื่อมต่อแอพกับเพจได้ใน Meta Business Suite > เครื่องมือทั้งหมด > แอพทางธุรกิจ
หมายเหตุ: คุณจะต้องให้แอพส่งข้อความทั้งหมดสำหรับธุรกิจของคุณสมัครรับข้อมูล Webhooks การส่งข้อความ
คุณจะต้องให้เพจของคุณสมัครรับข้อมูลเพื่อรับการแจ้งเตือน Webhooks ที่คุณต้องการรับ
MODERATE
บนเพจที่มีการสืบค้นได้
หากต้องการสมัครรับข้อมูลช่อง Webhooks ให้ส่งคำขอ POST
ไปที่จุดเชื่อมโยง subscribed_apps ของเพจโดยใช้โทเค็นการเข้าถึงของเพจ
curl -i -X POST "https://graph.facebook.com/PAGE-ID/subscribed_apps ?subscribed_fields=messages &access_token=PAGE-ACCESS-TOKEN"
{ "success": "true" }
หากต้องการดูว่าเพจของคุณติดตั้งแอพใดแล้วบ้าง ให้ส่งคำขอ GET
แทน
curl -i -X GET "https://graph.facebook.com/PAGE-ID/subscribed_apps &access_token=PAGE-ACCESS-TOKEN"
{ "data": [ { "category": "Business", "link": "https://my-clever-domain-name.com/app", "name": "My Sample App", "id": "APP-ID" "subscribed_fields": [ "messages" ] } ] }
API จะส่งคืนชุดข้อมูลที่ว่างเปล่า หากเพจของคุณไม่ได้ติดตั้งแอพใดๆ
คุณยังสามารถใช้ Graph API Explorer เพื่อส่งคำขอในการให้เพจของคุณสมัครรับข้อมูลช่อง Webhooks ได้อีกด้วย
pages_manage_metadata
การดำเนินการนี้จะแลกเปลี่ยนโทเค็นแอพของคุณเป็นโทเค็นการเข้าถึงผู้ใช้โดยได้รับสิทธิ์การอนุญาต pages_manage_metadata
GET
และเลือก POST
me?fields=id,name
เริ่มต้นด้วย ID ของเพจ ตามด้วย /subscribed_apps
จากนั้นส่งการสืบค้น แอพของคุณสามารถรับการแจ้งเตือนจากผู้ที่มีบทบาทในแอพ เช่น ผู้ดูแล ผู้พัฒนา หรือผู้ทดสอบของแอพได้โดยใช้เพียงสิทธิ์การเข้าถึงแบบมาตรฐาน ทั้งนี้ แอพจะต้องใช้สิทธิ์การเข้าถึงระดับสูง หากต้องการรับการแจ้งเตือนจากลูกค้าหรือผู้คนที่ไม่มีบทบาทในแอพของคุณ
โปรดเรียนรู้เพิ่มเติมเกี่ยวกับสิทธิ์การเข้าถึงแบบมาตรฐานและสิทธิ์การเข้าถึงระดับสูง รวมถึงข้อมูลที่เข้าถึงได้จากสิทธิ์การเข้าถึงแต่ละรูปแบบและข้อกำหนดสำหรับการนำไปใช้