企业内部开发
基础
连接微信
办公
会议
会议统计管理
企业内部开发
服务端API
消息接收与发送
智能机器人
智能机器人长连接
智能机器人长连接
最后更新:2026/03/08

目录

  • 概述
  •       通过部署SDK建立长连接
  •       长连接与短连接(Webhook)方式对比
  •       适用场景
  •       整体交互流程
  • 长连接配置说明
  •       开启长连接 API 模式
  •       获取凭证
  • 建立长连接
  •       WebSocket 连接地址
  •       连接数量限制
  •       连接建立流程
  •       订阅请求
  • 接收消息回调
  •       消息推送格式
  •       支持的消息类型
  •       多媒体资源解密
  • 接收事件回调
  •       事件推送格式
  •       支持的事件类型
  •             连接断开事件格式示例
  • 回复消息
  •       回复欢迎语
  •       回复普通消息
  •             流式消息回复机制
  •       更新模板卡片
  • 主动推送消息
  •       请求格式
  •       响应格式
  •       支持的消息类型
  • 保持心跳
  •       心跳机制说明
  •       心跳请求
  • 概述

    通过部署SDK建立长连接

    语言下载地址
    Node.jsaibot-node-sdk

    长连接与短连接(Webhook)方式对比

    智能机器人支持两种 API 模式接收消息回调:

    特性Webhook(短连接)WebSocket(长连接)
    连接方式每次回调建立新连接复用已建立的长连接
    延迟较高(每次需建连)低(复用连接)
    实时性一般
    服务端要求需要公网可访问的 URL无需固定的公网 IP
    加解密需要对消息加解密无需加解密
    复杂度较高(需维护心跳)
    可靠性高(无状态)需要心跳保活、断线重连
    适用场景普通回调场景高实时性要求、无固定公网 IP 场景

    适用场景

    推荐使用 WebSocket 长连接方式的场景:

    • 无公网 IP:开发者服务部署在内网环境,无法配置公网可访问的回调 URL
    • 高实时性要求:需要更低的消息延迟
    • 简化开发:无需处理消息加解密逻辑

    整体交互流程

    长连接模式的交互流程如下:

    开发者服务企业微信用户连接建立阶段建立WebSocket连接 (aibot_subscribe)1连接建立成功2进入会话事件进入机器人会话3事件回调 (aibot_event_callback)4回复欢迎语 (aibot_respond_welcome_msg)5展示欢迎消息6消息回调与流式消息@机器人发消息7消息回调 (aibot_msg_callback)8回复流式消息 (aibot_respond_msg, finish=false)9展示流式消息10更新流式内容 (aibot_respond_msg, finish=false)11更新流式消息12loop[开发者主动推送更新]完成流式消息 (aibot_respond_msg, finish=true)13展示最终消息14模板卡片交互点击模板卡片按钮15事件回调 (aibot_event_callback)16更新卡片 (aibot_respond_update_msg)17展示更新后的卡片18主动推送消息(无回调触发)主动推送消息 (aibot_send_msg)19展示推送消息20心跳保活ping21pong22loop[定时心跳]开发者服务企业微信用户

    流程说明:

    1. 连接建立阶段:开发者服务使用 BotID 和 Secret 向企业微信发起 WebSocket 连接请求(aibot_subscribe),连接建立成功后保持长连接状态
    2. 进入会话事件:用户首次进入机器人单聊会话时,企业微信推送事件回调(aibot_event_callback),开发者可回复欢迎语(aibot_respond_welcome_msg)
    3. 消息回调与流式消息:用户在群聊中@机器人或向机器人发送单聊消息时,企业微信推送消息回调(aibot_msg_callback)。与「设置接收消息 URL」模式不同,长连接模式下不再有流式刷新回调,开发者需主动推送流式更新内容,直到设置 finish=true 结束流式消息
    4. 模板卡片交互:用户点击模板卡片按钮时,企业微信推送事件回调(aibot_event_callback),开发者可更新卡片内容(aibot_respond_update_msg)
    5. 主动推送消息:开发者可在没有用户消息触发的情况下,通过 aibot_send_msg 主动向用户或群聊推送消息,适用于定时提醒、异步任务通知、告警推送等场景
    6. 心跳保活:开发者需定期发送心跳(ping)保持连接活跃,建议间隔 30 秒

    长连接配置说明

    开启长连接 API 模式

    在企业微信管理后台,进入智能机器人的配置页面,开启「API 模式」并选择「长连接」方式:

    企业微信截图_4df4a527-66cd-4422-85e2-62ab51f5e0b6.png

    获取凭证

    开启长连接 API 模式后,需要获取以下凭证用于建立连接:

    凭证说明
    BotID智能机器人的唯一标识,用于标识机器人身份
    Secret长连接专用密钥,用于身份校验
    注意
    - Secret 是长连接专用的密钥,与设置接收消息回调地址模式的 Token/EncodingAESKey 不同
    - 请妥善保管 Secret,避免泄露
    - 模式切换影响:API 模式只能选择一种方式(长连接或设置接收消息回调地址),切换到「设置接收消息回调地址」模式会导致现有长连接失效;反之,从「设置接收消息回调地址」切换到「长连接」模式后,原有的回调地址将不再生效

    建立长连接

    WebSocket 连接地址

    wss://openws.work.weixin.qq.com

    连接数量限制

    每个智能机器人同一时间只能保持一个有效的长连接。当同一个机器人发起新的连接请求并完成订阅(aibot_subscribe)时,新连接会踢掉旧连接,旧连接将被服务端主动断开。

    注意
    - 开发者需要在业务层面避免同一机器人建立多个长连接
    - 如果需要实现高可用,建议采用主备切换模式而非同时多连接
    - 旧连接被踢掉时,开发者会收到连接断开事件

    连接建立流程

    建立长连接的完整流程:

    开发者服务企业微信1. 发起 WebSocket 连接wss://openws.work.weixin.qq.com12. WebSocket 握手成功23. 发送订阅请求 (aibot_subscribe)携带 BotID 和 Secret34. 校验凭证5. 返回订阅结果4连接建立完成,开始接收回调开发者服务企业微信

    订阅请求

    WebSocket 连接建立后,需要发送订阅请求(aibot_subscribe)进行身份校验。

    注意:该请求有频率保护,订阅成功后应避免反复请求,否则可能触发系统限制。

    请求示例:

    {
        "cmd": "aibot_subscribe",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "bot_id": "BOTID",
            "secret": "SECRET"
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_subscribe
    headers.req_idstring请求唯一标识,由开发者自行生成,用于关联请求和响应
    body.bot_idstring智能机器人的 BotID,获取方法参考配置说明
    body.secretstring长连接专用密钥 Secret,获取方法参考配置说明

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    接收消息回调

    用户向智能机器人发送消息时,企业微信会通过长连接推送消息回调(aibot_msg_callback)。

    消息推送格式

    请求示例(文本消息):

    {
        "cmd": "aibot_msg_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "aibotid": "AIBOTID",
            "chatid": "CHATID",
            "chattype": "group",
            "from": {
                "userid": "USERID"
            },
            "msgtype": "text",
            "text": {
                "content": "@RobotA hello robot"
            }
        }
    }

    请求字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_msg_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.aibotidstring智能机器人 BotID
    body.chatidstring会话 ID,仅群聊类型时返回
    body.chattypestring会话类型,single 单聊 / group 群聊
    body.from.useridstring消息发送者的 userid
    body.msgtypestring消息类型

    支持的消息类型

    长连接模式支持以下消息类型的回调:

    消息类型msgtype说明
    文本消息text用户发送的文本内容
    图片消息image用户发送的图片,仅支持单聊
    图文混排mixed用户发送的图文混排内容
    语音消息voice用户发送的语音(转为文本),仅支持单聊
    文件消息file用户发送的文件,仅支持单聊
    说明:各消息类型的 body 结构与设置接收消息回调地址模式一致,详细字段请参考对应链接。

    多媒体资源解密

    长连接模式下,imagefile 结构体中会额外返回解密密钥 aeskey,用于解密下载的资源文件:

    图片结构体示例:

    {
        "image": {
            "url": "URL",
            "aeskey": "AESKEY"
        }
    }

    文件结构体示例:

    {
        "file": {
            "url": "URL",
            "aeskey": "AESKEY"
        }
    }
    字段类型说明
    urlstring资源下载地址,5 分钟内有效
    aeskeystring解密密钥,每个下载链接的 aeskey 唯一
    注意
    - 每个 URL 对应的 aeskey 都是唯一的,不同于设置接收消息回调地址模式使用统一的 EncodingAESKey
    - 加密方式:AES-256-CBC,数据采用 PKCS#7 填充至 32 字节的倍数
    - IV 初始向量大小为 16 字节,取 aeskey 前 16 字节

    接收事件回调

    用户与智能机器人发生交互时,企业微信会通过长连接推送事件回调(aibot_event_callback)。

    事件推送格式

    请求示例(进入会话事件):

    {
        "cmd": "aibot_event_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "create_time": 1700000000,
            "aibotid": "AIBOTID",
            "from": {
                "userid": "USERID"
            },
            "msgtype": "event",
            "event": {
                "eventtype": "enter_chat"
            }
        }
    }

    请求字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_event_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.create_timeint事件产生的时间戳
    body.aibotidstring智能机器人 BotID
    body.chatidstring会话 ID,仅群聊类型时返回
    body.chattypestring会话类型,single 单聊 / group 群聊
    body.from.useridstring事件触发者的 userid
    body.msgtypestring消息类型,事件回调固定为 event
    body.event.eventtypestring事件类型

    支持的事件类型

    长连接模式支持以下事件类型的回调:

    事件类型eventtype说明
    进入会话事件enter_chat用户当天首次进入机器人单聊会话
    模板卡片事件template_card_event用户点击模板卡片按钮
    用户反馈事件feedback_event用户对机器人回复进行反馈
    连接断开事件disconnected_event当有新连接建立时,系统会给旧连接发送该事件并且主动断开旧连接

    连接断开事件格式示例

    {
        "cmd": "aibot_event_callback",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgid": "MSGID",
            "create_time": 1700000000,
            "aibotid": "AIBOTID",
            "msgtype": "event",
            "event": {
                "eventtype": "disconnected_event"
            }
        }
    }

    连接断开事件字段说明:

    字段类型说明
    cmdstring命令类型,固定值 aibot_event_callback
    headers.req_idstring请求唯一标识,回复消息时需透传
    body.msgidstring本次回调的唯一性标志,用于事件排重
    body.create_timeint事件产生的时间戳
    body.aibotidstring智能机器人 BotID
    body.msgtypestring消息类型,事件回调固定为 event
    body.event.eventtypestring此时固定为disconnected_event
    说明:除连接断开事件外,其他各事件类型的 body 结构与设置接收消息回调地址模式一致,详细字段请参考对应链接。

    回复消息

    收到消息回调或事件回调后,开发者可通过长连接主动回复消息。

    回复欢迎语

    收到进入会话事件(enter_chat)后,开发者可使用 aibot_respond_welcome_msg 命令回复欢迎语。

    请求示例(文本欢迎语):

    {
        "cmd": "aibot_respond_welcome_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgtype": "text",
            "text": {
                "content": "您好!我是智能助手,有什么可以帮您的吗?"
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_welcome_msg
    headers.req_idstring透传事件回调中的 req_id
    bodyobject消息内容,详见回复欢迎语

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }
    注意
    - 该命令仅适用于进入会话事件,其他事件类型不支持
    - 收到事件回调后需在 5 秒内 发送回复,超时将无法发送欢迎语

    回复普通消息

    收到消息回调(aibot_msg_callback)后,开发者可使用 aibot_respond_msg 命令回复消息。支持流式消息、模板卡片及组合回复。

    频率限制:收到消息回调后,24 小时内可以往该会话回复 30 条消息。每次收到消息回调,会恢复该会话的回复消息额度(即24小时内30条消息)。当回复消息的额度消耗完,会消耗主动推送消息额度(参见:主动推送消息)。

    版本要求:回复流式消息需要企业微信客户端 5.0.6 及以上版本支持。

    流式消息回复机制

    流式消息的发送和刷新通过 stream.id 进行关联:

    • 发送流式消息:首次使用某个 stream.id 回复时,会创建一条新的流式消息
    • 刷新流式消息:继续使用相同的 stream.id 推送时,会更新该流式消息的内容
    • 完成流式消息:设置 finish=true 结束流式消息,消息将不再可更新
    注意:从流式消息发送开始,需在 6 分钟内 完成所有刷新并设置 finish=true,否则消息将自动结束。

    两种模式的流式刷新方式对比:

    模式刷新方式说明
    设置接收消息地址回调轮询企业微信通过轮询回调开发者的接收消息地址来获取流式消息的刷新内容
    长连接主动推送开发者服务主动通过长连接推送流式刷新消息,无需等待回调

    流式消息交互流程:

    开发者服务企业微信用户@机器人发消息1aibot_msg_callback (req_id=xxx)2生成唯一的 stream.idaibot_respond_msg (req_id=xxx)(stream.id=abc, finish=false)content="正在查询..."3首次使用该 stream.id创建新的流式消息展示流式消息4aibot_respond_msg (req_id=xxx)(stream.id=abc, finish=false)content="广州今日天气:29度..."5继续使用相同 stream.id刷新消息内容更新流式消息6aibot_respond_msg (req_id=xxx)(stream.id=abc, finish=false)content="广州今日天气:29度,多云,降雨概率60%..."7更新流式消息8aibot_respond_msg (req_id=xxx)(stream.id=abc, finish=true)content="广州今日天气:29度,多云,降雨概率60%,建议携带雨具。"9finish=true流式消息结束展示最终消息106分钟超时限制:从首次发送开始计时开发者服务企业微信用户
    说明:在长连接模式下,针对同一次消息回调的所有流式消息回复(包括首次发送和后续刷新),都需要使用回调中相同的 req_idreq_id 用于关联回调请求与响应,stream.id 用于标识同一条流式消息。

    请求示例(流式消息回复):

    {
        "cmd": "aibot_respond_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "msgtype": "stream",
            "stream": {
                "id": "STREAMID",
                "finish": false,
                "content": "正在为您查询天气信息..."
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_msg
    headers.req_idstring透传消息回调中的 req_id
    bodyobject消息内容,详见回复用户消息
    注意:目前暂不支持 msg_item 字段。

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    更新模板卡片

    收到模板卡片点击事件(template_card_event)后,开发者可使用 aibot_respond_update_msg 命令更新卡片内容。

    请求示例:

    {
        "cmd": "aibot_respond_update_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "response_type": "update_template_card",
            "template_card": {
                "card_type": "button_interaction",
                "main_title": {
                    "title": "xx系统告警",
                    "desc": "服务器CPU使用率超过90%"
                },
                "button_list": [
                    {
                        "text": "确认中",
                        "style": 1,
                        "key": "confirm"
                    },
                    {
                        "text": "误报",
                        "style": 2,
                        "key": "false_alarm"
                    }
                ],
                "task_id": "TASK_ID",
                "feedback": {
                    "id": "FEEDBACKID"
                }
            }
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_respond_update_msg
    headers.req_idstring透传事件回调中的 req_id
    bodyobject消息内容,详见更新模板卡片

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }
    注意
    - 该命令仅适用于模板卡片点击事件,其他事件类型不支持
    - 收到事件回调后需在 5 秒内 发送回复,超时将无法更新卡片

    主动推送消息

    在某些场景下,开发者需要在没有用户消息触发的情况下,主动向用户或群聊推送消息。例如:

    • 定时提醒:定时推送日报、周报、待办提醒等
    • 异步任务通知:后台任务完成后主动通知用户结果
    • 告警推送:系统监控告警主动推送给相关人员

    长连接模式支持通过 aibot_send_msg 命令主动推送消息,无需依赖消息回调。特殊的,需要用户在会话中给机器人发消息,后续机器人才能主动推送消息给对应会话中

    频率限制:每个自然日每个会话可以主动推送 10 条消息。若用户给机器人发送了消息,则相应的会话在24小时内有回复30条消息的额度,机器人主动推送消息时,会优先消耗此30条回复消息的额度。

    请求格式

    请求示例(markdown 消息):

    {
        "cmd": "aibot_send_msg",
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "body": {
            "chatid": "CHATID",
            "msgtype": "markdown",
            "markdown": {
                "content": "这是一条**主动推送**的消息"
            }
        }
    }
    说明:消息 body 的具体格式请参考消息类型及数据格式

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 aibot_send_msg
    headers.req_idstring请求唯一标识,由开发者自行生成,用于关联请求和响应
    body.chatidstring会话 ID,支持单聊和群聊。单聊填用户的 userid,群聊填对应群聊相关回调事件中获取的chatid
    body.msgtypestring消息类型,支持 template_card(模板卡片)、markdown
    body.template_cardobject模板卡片内容,msgtype 为 template_card 时必填
    body.markdownobjectmarkdown 消息内容,msgtype 为 markdown 时必填

    响应格式

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    支持的消息类型

    消息类型msgtype说明
    模板卡片template_card模板卡片消息,详见消息类型及数据格式
    MarkdownmarkdownMarkdown 格式消息,详见消息类型及数据格式

    保持心跳

    连接建立成功后,开发者需定期发送心跳请求(ping)保持连接活跃,防止连接被服务端主动断开。

    心跳机制说明

    • 心跳间隔:建议每 30 秒 发送一次心跳
    • 超时断开:若长时间未收到心跳,服务端会主动断开连接
    • 断线重连:开发者需实现断线检测和自动重连机制

    心跳请求

    请求示例:

    {
        "cmd": "ping",
        "headers": {
            "req_id": "REQUEST_ID"
        }
    }

    请求字段说明:

    字段类型必填说明
    cmdstring命令类型,固定值 ping
    headers.req_idstring请求唯一标识,由开发者自行生成

    响应示例:

    {
        "headers": {
            "req_id": "REQUEST_ID"
        },
        "errcode": 0,
        "errmsg": "ok"
    }

    响应字段说明:

    字段类型说明
    headers.req_idstring透传请求中的 req_id
    errcodeint错误码,0 表示成功
    errmsgstring错误信息,成功时为 "ok"

    上一篇主动回复消息
    下一篇获取群聊列表
      本节内容
    服务端API
    基础
    连接微信
    办公
    会议
    会议统计管理
    客户端API
    小程序
    基础
    连接微信
    办公
    JS-SDK
    基础
    连接微信
    办公
    消息推送(原“群机器人”)
    更新日志
    联系我们