广告位 · 页头(后台-模块管理-新建模块后替换此区域)

微信公众号客服消息有哪些类型?如何封装文字、图片、图文与小程序消息?

客服消息接口允许公众号在用户主动发送消息后的48小时内,向该用户推送一条或数条消息。所有消息都是通过HTTP POST方式提交一段XML数据到微信服务器,服务器根据MsgType字段识别消息类型,再解析对应的字段。消息结构的正确性直接决定接口能否调用成功,而文字、图片、图文、小程序这四种类型在XML结构上各有差异,下面逐一拆解。

微信公众号客服消息有哪些类型?如何封装文字、图片、图文与小程序消息?

一、文字消息与基础XML结构

文字消息是最简单的客服消息类型,XML根节点为<xml>,内部包含ToUserName、MsgType、Content三个必填字段。ToUserName是接收消息的用户OpenID,MsgType固定为text,Content是回复的文本内容,长度不能超过600字节。由于XML本身对特殊字符敏感,文本内容建议使用CDATA段包裹,避免出现&、<等字符导致解析失败。以下是一个标准的文字消息XML结构:

<xml>
  <ToUserName><![CDATA[openid_xxx]]></ToUserName>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[你好,欢迎咨询]]></Content>
</xml>

在实际开发中,我们会用程序拼接这段XML。以PHP为例,可以定义一个数组,再通过递归函数转换成XML字符串,或者直接使用heredoc语法。需要特别注意的是,ToUserName的值必须是用户OpenID,如果是从接收消息的XML中获取的FromUserName字段,直接复用即可。另外,客服消息接口调用成功后微信会返回errcode:0,如果返回其他错误码,通常意味着XML格式错误或缺少必填节点。

很多开发者习惯用JSON格式调用微信接口,但客服消息目前只接受XML格式的POST数据。因此,封装一个通用的XML构造函数可以避免大量重复代码。建议在构造XML时统一对所有文本类型字段使用CDATA包裹,即使字段内容为空也不要省略节点,保持结构完整。

二、图片消息与图文消息的XML构造

图片消息的MsgType为image,但它不直接发送图片文件,而是发送一个media_id,这个media_id需要提前通过素材管理接口上传获得。图片消息的XML结构如下:

<xml>
  <ToUserName><![CDATA[openid_xxx]]></ToUserName>
  <MsgType><![CDATA[image]]></MsgType>
  <Image>
    <MediaId><![CDATA[media_id_xxx]]></MediaId>
  </Image>
</xml>

获取media_id的方式是调用media/upload接口,将图片以multipart/form-data格式上传,返回的media_id三天内有效。如果是临时素材,可以在客服消息中直接使用;如果是永久素材,则需要使用material/add_material接口获取永久media_id,但客服消息中只能使用临时素材的media_id。上传时注意图片大小不能超过2MB,支持bmp、png、jpeg、jpg格式。

图文消息稍微复杂一些,MsgType为news,必须包含ArticleCount节点,且其值必须与Articles内部的item数量一致。每条item包含Title、Description、PicUrl、Url四个字段,其中PicUrl和Url必须是可访问的URL,且Url需要是已认证的域名或微信认可的地址。以下是一个包含两条图文的消息示例:

<xml>
  <ToUserName><![CDATA[openid_xxx]]></ToUserName>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>2</ArticleCount>
  <Articles>
    <item>
      <Title><![CDATA[第一条标题]]></Title>
      <Description><![CDATA[第一条描述]]></Description>
      <PicUrl><![CDATA[https://ipipp.com/pic1.jpg]]></PicUrl>
      <Url><![CDATA[https://ipipp.com/article1]]></Url>
    </item>
    <item>
      <Title><![CDATA[第二条标题]]></Title>
      <Description><![CDATA[第二条描述]]></Description>
      <PicUrl><![CDATA[https://ipipp.com/pic2.jpg]]></PicUrl>
      <Url><![CDATA[https://ipipp.com/article2]]></Url>
    </item>
  </Articles>
</xml>

构造图文消息时最容易出错的是ArticleCount和Articles内部item的数量不一致,微信服务器会直接报错。另外,PicUrl如果为空,可以留空节点但不要省略整个PicUrl字段。此外,图文消息中的Url点击后可以跳转到任何网页,但要避免使用IP地址或未备案域名,否则可能被微信拦截。

在实际项目中,可以封装一个通用的数组转XML函数,将数据以数组形式组织,再递归生成XML,这样可以减少手写XML出错的概率。例如在PHP中,使用SimpleXMLElement也可以方便地构造XML,但要注意CDATA的处理,SimpleXMLElement默认不会生成CDATA,需要额外处理。

三、小程序卡片消息与封装注意事项

小程序卡片消息的MsgType为miniprogrampage,它允许用户在聊天窗口直接点击卡片进入小程序指定页面。XML结构如下:

<xml>
  <ToUserName><![CDATA[openid_xxx]]></ToUserName>
  <MsgType><![CDATA[miniprogrampage]]></MsgType>
  <Title><![CDATA[小程序卡片标题]]></Title>
  <AppId><![CDATA[wx1234567890abcdef]]></AppId>
  <PagePath><![CDATA[pages/index/index?foo=bar]]></PagePath>
  <ThumbMediaId><![CDATA[thumb_media_id_xxx]]></ThumbMediaId>
</xml>

这里的AppId必须是已关联的小程序AppID,PagePath是小程序页面路径,可以携带参数,但参数长度有限制。ThumbMediaId是卡片封面图片的临时素材media_id,同样需要通过上传接口获取。需要注意的是,ThumbMediaId对应的图片建议尺寸为520*416,大小不超过128KB,否则可能导致卡片显示异常。另外,小程序卡片消息只能在客服消息接口中使用,被动回复消息不支持该类型。

在封装客服消息时,除了XML结构本身,还需要注意几个通用问题。首先是客服消息的发送次数限制:用户每发送一条消息,公众号可以在48小时内回复最多20条消息(包括被动回复和主动推送)。其次是access_token的获取和管理,因为调用客服消息接口需要有效的access_token,建议使用中控服务器统一维护并缓存。最后是XML的编码问题,确保所有中文字符以UTF-8编码,否则会导致乱码或解析失败。

调试客服消息接口时,如果遇到错误,可以先使用微信官方的接口调试工具手动发送XML,排除程序拼接的问题。常见的错误码如40003表示OpenID错误,45015表示回复时间超过限制,45047表示客服消息条数超过上限,这些都可以通过查阅官方文档快速定位。掌握这四种消息类型的XML封装后,结合素材上传和access_token管理,就能稳定地实现客服消息的自动回复和主动推送功能。

广告位 · 文章底部(后台-模块管理替换此区域)