服务器接受文本消息
用户给公众号发送的信息都会发送到之前你配置服务器(不清楚服务器配置的可以参考之前的文章【个人小程序订阅号开发】微信后台服务端接入 Java实现)。我们可以接受消息体解析并对相应的消息做出自动回复。
假设有如下场景
- A 向公众号发送“人工服务”文本信息
- 公众号回复A用户如下内容:“好的,正在为你转接中”
开发代码
基于上一章节代码基础开发新的代码。
接收文本消息实体类
官方文本数据说明如下
xml 样例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
<MsgDataId>xxxx</MsgDataId>
<Idx>xxxx</Idx>
</xml>
字段说明
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方账号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 消息类型,文本为text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
MsgDataId | 消息的数据ID(消息如果来自文章时才有) |
Idx | 多图文时第几篇文章,从1开始(消息如果来自文章时才有) |
添加 XML Maven 依赖
由于接收到的消息是XML格式的,添加如下maven 依赖
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
</dependency>
ReceiveTextMessage实体类Java
package top.xyx0123.wx.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
/**
* ReceiveTextMessage.
*/
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@Schema(example =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<xml>\n" +
"\t<Content>你好</Content>\n" +
"\t<CreateTime>0</CreateTime>\n" +
"\t<ToUserName>B</ToUserName>\n" +
"\t<FromUserName>A</FromUserName>\n" +
"\t<MsgDataId>msgDataId</MsgDataId>\n" +
"\t<MsgId>msgId</MsgId>\n" +
"\t<MsgType>text</MsgType>\n" +
"</xml>")
public class ReceiveTextMessage {
private String ToUserName;
private String FromUserName;
private long CreateTime;
private String MsgType;
private long MsgId;
private String MsgDataId;
private String Content;
}
响应文本消息实体类
xml 样例
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
字段说明
参数 | 是否必须 | 描述 |
---|---|---|
ToUserName | 是 | 接收方账号(收到的OpenID) |
FromUserName | 是 | 开发者微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | 消息类型,文本为text |
Content | 是 | 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示) |
ResponseTextMessage实体类Java
package top.xyx0123.wx.entity;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;
/**
* ResponseTextMessage.
*/
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ResponseTextMessage {
private String ToUserName;
private String FromUserName;
private long CreateTime;
private String MsgType;
private String Content;
}
Controller定义Post消息接收接口
Notice: consumes = {"text/xml; charset=UTF-8"}) 经过测试,微信以Content-Type: text/xml;charset=UTF-8请求。
@RequestMapping(value = "/wechat/validate", method = RequestMethod.POST,
produces = {"application/xml; charset=UTF-8",},
consumes = {"text/xml; charset=UTF-8"})
public ResponseTextMessage receiveMessage(
@RequestBody ReceiveTextMessage receiveTextMessage) {
log.info("Receive message: {}", receiveTextMessage);
// 响应的消息
ResponseTextMessage responseTextMessage = new ResponseTextMessage();
responseTextMessage.setToUserName(receiveTextMessage.getFromUserName());
responseTextMessage.setFromUserName(receiveTextMessage.getToUserName());
responseTextMessage.setCreateTime(new Date().getTime());
responseTextMessage.setMsgType(receiveTextMessage.getMsgType());
responseTextMessage.setContent("好的,正在为你转接中");
return responseTextMessage;
}
测试
本地swagger测试
正式环境测试
为了测试开发公众号的功能,我也是新申请了一个订阅号。和大家一样从0开始的。大家可以关注我的公众号(软件老许)去验证实现的功能,或者扫描下方二维码测试本次内容功能。目前实现了发送文本自动回复文本消息如文章中提到的功能。后面开发的功能也都会集成到这个公众号上面。接下来我再看看有什么比较好玩有趣的功能都会开发分享。
最后谢谢大家! 十一国庆快乐!