You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:32:49