如何将DialogFlow的JSON响应转换为Messenger式富消息
从DialogFlow自定义Payload到Messenger风格富消息的实现步骤
嘿,作为刚接触这类开发的新手,能搞定DialogFlow的自定义payload已经超棒啦!我来一步步给你拆解怎么把那些JSON转成类似Facebook Messenger的富消息(按钮、轮播这些)~
1. 先搞懂Messenger富消息的核心结构
Messenger的富消息(按钮、轮播、卡片)都有固定的JSON格式,你要做的就是把DialogFlow返回的payload里的数据,对应映射到这些结构里。核心的两种类型:
- 按钮消息(Button Template):需要包含
attachment类型为template,子类型button,再搭配文本和按钮数组。 - 轮播消息(Generic Template):属于
template类型下的generic,里面可以放多个elements元素,每个元素能包含标题、图片、按钮等内容。
2. 从DialogFlow Payload提取数据
先假设你的DialogFlow返回的自定义payload是这样的(举个实际场景的例子):
{ "response_type": "button", "text": "你想了解哪方面内容?", "buttons": [ {"label": "产品介绍", "action": "show_product"}, {"label": "联系客服", "action": "contact_support"} ] }
你需要先解析这个JSON,提取出关键字段:显示文本、按钮的标签和对应的动作指令。
3. 转换为Messenger风格的消息结构
例子1:按钮消息
把上面的DialogFlow payload转换成Messenger的Button Template格式:
{ "attachment": { "type": "template", "payload": { "template_type": "button", "text": "你想了解哪方面内容?", "buttons": [ { "type": "postback", "title": "产品介绍", "payload": "show_product" }, { "type": "postback", "title": "联系客服", "payload": "contact_support" } ] } } }
这里要注意几个细节:
- Messenger的按钮常用两种类型:
postback(点击后给后端发送指定消息)或web_url(直接跳转外部链接),根据你的需求选择即可。 - 把DialogFlow payload里的
label对应到Messenger结构的title,action对应到payload(postback类型)或者url(web_url类型)。
例子2:轮播消息
如果你的DialogFlow payload是轮播类的数据:
{ "response_type": "carousel", "elements": [ { "title": "产品A", "description": "这是产品A的详细介绍", "image_url": "https://example.com/productA.jpg", "button_label": "查看详情", "button_action": "view_productA" }, { "title": "产品B", "description": "这是产品B的详细介绍", "image_url": "https://example.com/productB.jpg", "button_label": "查看详情", "button_action": "view_productB" } ] }
转换成Messenger的Generic Template格式:
{ "attachment": { "type": "template", "payload": { "template_type": "generic", "elements": [ { "title": "产品A", "subtitle": "这是产品A的详细介绍", "image_url": "https://example.com/productA.jpg", "buttons": [ { "type": "postback", "title": "查看详情", "payload": "view_productA" } ] }, { "title": "产品B", "subtitle": "这是产品B的详细介绍", "image_url": "https://example.com/productB.jpg", "buttons": [ { "type": "postback", "title": "查看详情", "payload": "view_productB" } ] } ] } } }
这里要注意:Messenger里轮播的描述字段是subtitle,不是description;每个轮播元素可以添加多个按钮,根据需求扩展即可。
4. 代码层面的实现思路(以JavaScript为例)
作为新手,用简单的JS来举例,假设你已经拿到了DialogFlow的响应payload:
// 假设这是从DialogFlow接口拿到的自定义payload const dfPayload = { "response_type": "button", "text": "你想了解哪方面内容?", "buttons": [{"label": "产品介绍", "action": "show_product"}, {"label": "联系客服", "action": "contact_support"}] }; let messengerMessage; // 根据response_type生成对应类型的Messenger消息 switch(dfPayload.response_type) { case "button": messengerMessage = { attachment: { type: "template", payload: { template_type: "button", text: dfPayload.text, buttons: dfPayload.buttons.map(btn => ({ type: "postback", title: btn.label, payload: btn.action })) } } }; break; case "carousel": messengerMessage = { attachment: { type: "template", payload: { template_type: "generic", elements: dfPayload.elements.map(item => ({ title: item.title, subtitle: item.description, image_url: item.image_url, buttons: [{ type: "postback", title: item.button_label, payload: item.button_action }] })) } } }; break; // 可以继续扩展其他类型,比如卡片、图片消息等 default: // 默认返回纯文本消息,避免结构缺失导致报错 messengerMessage = {text: dfPayload.text || "抱歉,我暂时无法提供相关内容"}; } // 之后把messengerMessage发送给前端聊天界面或者对应的平台接口 console.log(messengerMessage);
这个思路的核心是:先判断DialogFlow返回的响应类型,再用数组的map方法批量转换元素,这样代码更简洁,也方便后续扩展新的消息类型。
5. 新手友好的小提示
- 测试时可以直接把生成的Messenger JSON复制到Messenger的官方测试工具里,快速预览显示效果。
- 如果是Web前端展示,你还需要把这些JSON渲染成对应的HTML组件(比如按钮用
<button>标签,轮播用滑块组件),但核心前提是先把数据结构转对。 - 记得处理边界情况:比如DialogFlow返回的payload里缺少某些字段时,要设置默认值,避免代码报错。
内容的提问来源于stack exchange,提问作者jerome
相关产品推荐
相关产品推荐

