Facebook Messages Webhook JSON结构差异的产生原因是什么?
Meta(原Facebook)消息API结构差异解答
结构差异的官方说明与产生原因
这三类结构的差异是官方明确定义的,对应消息流转的三个完全不同的链路场景:
- 第一类顶层直接带
message字段的结构:属于单条消息详情接口/主动发消息响应结构,当你调用Send API主动给用户发消息、或者单独调用接口查询某条消息的详情时,返回的就是这个结构,没有外层封装是因为接口本身仅返回单条消息的完整数据。
{ "sender":{ "id":"<PSID>" }, "recipient":{ "id":"<PAGE_ID>" }, "timestamp":1458692752478, "message":{ "mid":"mid.1457764197618:41d102a3e1ae206a38", "text":"hello, world!", "quick_reply": { "payload": "<DEVELOPER_DEFINED_PAYLOAD>" } } }
- 第二类外层带
id、time字段,内层封装messaging数组的结构:属于旧版单页面Webhook通知结构,外层的id是触发事件的Facebook页面ID,time是Meta服务器生成的事件触发时间,这个结构仅在早期旧版Webhook、且只订阅单个页面事件的场景下返回。
{ "id": "682498302938465", "time": 1518479195594, "messaging": [ { "sender": { "id": "<PSID>" }, "recipient": { "id": "<PAGE_ID>" }, "timestamp": 1518479195308, "message": { "mid": "mid.$cAAJdkrCd2ORnva8ErFhjGm0X_Q_c", "attachments": [ { "type": "<image|video|audio|file>", "payload": { "url": "<ATTACHMENT_URL>" } } ] } } ] }
- 第三类带
object: page、外层封装entry数组的结构:是当前官方通用的标准Webhook通知结构,entry数组支持同时推送多个订阅页面的事件,兼容性最强,也是现在官方推荐开发者适配的结构。
{ "object": "page", "entry": [ { "id": "<PAGE_ID>", "time": 1583173667623, "messaging": [ { "sender": { "id": "<PSID>" }, "recipient": { "id": "<PAGE_ID>" }, "timestamp": 1583173666767, "message": { "mid": "m_toDnmD...", "text": "This is where I want to go: https://youtu.be/bbo_fZAjIhg", "attachments": [ { "type": "fallback", "payload": { "url": "<ATTACHMENT_URL >", "title": "TAHITI - Heaven on Earth" } } ] } } ] } ] }
messaging字段为数组的设计原因
设计为数组是为了批量推送同一时间窗口内产生的多条消息事件,减少Webhook的HTTP请求频次,降低两端的传输开销。
数组是否支持存放多条消息
支持,同一个messaging数组内可以存放同一页面、同一批触发的多条消息交互事件,开发时直接遍历数组处理即可,无需限制单条逻辑。
内容的提问来源于stack exchange,提问作者Pop Flamingo
相关产品推荐
相关产品推荐

