← 返回首页

第2章: 公众号消息管理

掌握公众号消息接收与回复机制

消息类型概述

公众号可以接收和发送多种类型的消息,实现与用户的互动。

接收消息类型

发送消息类型

💡 提示: 用户发送消息后,公众号必须在5秒内回复,否则微信会提示"该公众号暂时无法提供服务"。

消息数据格式

消息格式说明

微信服务器将消息以XML格式POST到开发者服务器。

公共参数

参数 说明
ToUserName 开发者微信号(公众号原始ID)
FromUserName 发送方OpenID
CreateTime 消息创建时间(整型)
MsgType 消息类型(text/image/voice等)
MsgId 消息ID(64位整型)

接收与回复文本消息

接收文本消息XML格式

<xml> <ToUserName><![CDATA[gh_1234567890ab]]></ToUserName> <FromUserName><![CDATA[oABCDEFGHIJKLMNOPQRSTUVWXYZ]]></FromUserName> <CreateTime>1648800000</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> <MsgId>1234567890123456</MsgId> </xml>

Spring Boot 接收与回复示例

@RestController @RequestMapping("/wechat") public class WechatMessageController { @PostMapping public String handleMessage(@RequestBody String xml) { // 这里可以使用 JAXB / XStream / 自己解析 XML // 为了示例,省略解析细节,只演示返回一个固定文本 String toUser = "用户OpenID"; // 从 XML 中解析 String fromUser = "公众号原始ID"; // 从 XML 中解析 return buildTextMessage(toUser, fromUser, "你好,我收到了你的消息!"); } private String buildTextMessage(String toUser, String fromUser, String content) { long now = System.currentTimeMillis() / 1000; return "<xml>" + "<ToUserName><![CDATA[" + toUser + "]]></ToUserName>" + "<FromUserName><![CDATA[" + fromUser + "]]></FromUserName>" + "<CreateTime>" + now + "</CreateTime>" + "<MsgType><![CDATA[text]]></MsgType>" + "<Content><![CDATA[" + content + "]]></Content>" + "</xml>"; } }

回复图文消息

图文消息XML格式

<xml> <ToUserName><![CDATA[openid]]></ToUserName> <FromUserName><![CDATA[gh_id]]></FromUserName> <CreateTime>1648800000</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[标题1]]></Title> <Description><![CDATA[描述1]]></Description> <PicUrl><![CDATA[https://example.com/pic1.jpg]]></PicUrl> <Url><![CDATA[https://example.com/article1]]></Url> </item> </Articles> </xml>

构建图文消息

public String buildNewsMessage(String toUser, String fromUser, List<Article> articles) { long now = System.currentTimeMillis() / 1000; StringBuilder items = new StringBuilder(); for (Article a : articles) { items.append(" <item>") .append("<Title><![CDATA[").append(a.getTitle()).append("]]></Title>") .append("<Description><![CDATA[").append(a.getDescription()).append("]]></Description>") .append("<PicUrl><![CDATA[").append(a.getPicUrl()).append("]]></PicUrl>") .append("<Url><![CDATA[").append(a.getUrl()).append("]]></Url>") .append("</item>"); } return "<xml>" + "<ToUserName><![CDATA[" + toUser + "]]></ToUserName>" + "<FromUserName><![CDATA[" + fromUser + "]]></FromUserName>" + "<CreateTime>" + now + "</CreateTime>" + "<MsgType><![CDATA[news]]></MsgType>" + "<ArticleCount>" + articles.size() + "</ArticleCount>" + "<Articles>" + items + "</Articles>" + "</xml>"; }

接收事件推送

关注事件

<xml> <ToUserName><![CDATA[gh_1234567890ab]]></ToUserName> <FromUserName><![CDATA[openid]]></FromUserName> <CreateTime>1648800000</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> </xml>

处理关注事件(Java)

// 伪代码示例,省略 XML 解析细节 if ("event".equals(msgType) && "subscribe".equals(event)) { String replyXml = buildTextMessage(fromUser, toUser, "欢迎关注!回复\"帮助\"查看功能。"); // 返回 replyXml 即可 }

客服消息API

发送客服消息(Java)

public Map<String, Object> sendCustomMessage(String accessToken, String openId, String content) { String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken; Map<String, Object> text = new HashMap<>(); text.put("content", content); Map<String, Object> body = new HashMap<>(); body.put("touser", openId); body.put("msgtype", "text"); body.put("text", text); return restTemplate.postForObject(url, body, Map.class); }

本章小结

← 上一章:公众号入门 下一章:自定义菜单开发 →