关注、接收和发送消息
上一节讲述了配置接口,这次看一下关注、接收和发送消息。
我们先看效果图
在上一次的controller里面加上:
@PostMapping("/wx")
public void doPost(HttpServletRequest request, HttpServletResponse response) {
response.setCharacterEncoding("utf-8");
PrintWriter out = null;
//将微信请求xml转为map格式,获取所需的参数
Map<String, String> map = MessageUtil.xmlToMap(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String Event = map.get("Event");
String message = null;
if ("subscribe".equals(Event)) {
message = MessageUtil.subscribeMessage(FromUserName, ToUserName);
} else if ("unsubscribe".equals(Event)) {
return;
} else if ("text".equals(MsgType)) {
//用户输入特定内容,输入1,回复相应的封装的内容
if ("1".equals(Content)) {
message = MessageUtil.initMessage(FromUserName, ToUserName);
} else {
//用户发来其他消息处理
message = MessageUtil.reversalMessage(FromUserName, ToUserName, Content);
}
}
try {
out = response.getWriter();
out.write(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
model里面则为:
public class BaseMessage {
protected String ToUserName;
protected String FromUserName;
protected long CreateTime;
protected String MsgType;
public BaseMessage() {
super();
}
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
另外一个model:
package com.xbjs.wechat.model;
public class MessageText extends BaseMessage {
private String Content;//文本消息内容
private String MsgId;//消息id,64位整型
public MessageText() {
}
public MessageText(String toUserName, String fromUserName,
long createTime, String msgType, String content, String msgId) {
super();
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
Content = content;
MsgId = msgId;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
}
再看看微信消息工具:
/**
* @author zxc
* @Title: MessageUtil
* @ProjectName wechat
* @Description: 处理消息
* @date 2018/10/295:10 PM
*/
public class MessageUtil {
public static Map<String, String> xmlToMap(HttpServletRequest request) {
Map<String, String> map = new HashMap<>();
SAXReader reader = new SAXReader();
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element element : elementList) {
map.put(element.getName(), element.getText());
}
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return map;
}
/**
* 将发送消息封装成对应的xml格式
*/
public static String messageToxml(MessageText message) {
XStream xstream = new XStream();
xstream.alias("xml", message.getClass());
return xstream.toXML(message);
}
/**
* 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
*
* @param FromUserName
* @param ToUserName
*/
public static String initMessage(String FromUserName, String ToUserName) {
MessageText text = new MessageText();
text.setToUserName(FromUserName);
text.setFromUserName(ToUserName);
text.setContent("fuck");
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return messageToxml(text);
}
/**
* 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
*
* @param FromUserName
* @param ToUserName
*/
public static String subscribeMessage(String FromUserName, String ToUserName) {
MessageText text = new MessageText();
text.setToUserName(FromUserName);
text.setFromUserName(ToUserName);
text.setContent("欢迎关注");
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return messageToxml(text);
}
/**
* 封装发送消息对象,封装时,需要将调换发送者和接收者的关系
*
* @param FromUserName
* @param ToUserName
* @param Content
*/
public static String reversalMessage(String fromUserName, String toUserName, String Content) {
MessageText text = new MessageText();
text.setToUserName(fromUserName);
text.setFromUserName(toUserName);
text.setContent("您发的消息为:" + Content);
text.setCreateTime(new Date().getTime());
text.setMsgType("text");
return messageToxml(text);
}
}
这里先将收到的消息转为了map,使用
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> </dependency>
微信官方消息为xml结构:
接收消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1248861860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>789456126411</MsgId>
</xml>
发送消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>816451315</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[HelloWord]]></Content>
</xml>
消息体转xml用到:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.11.1</version>
</dependency>
上一节
希望能交流更多技术,关注小白的微信公众号吧。