上一篇文章微信公众号环境搭建与开发接入链接(https://blog.csdn.net/swiftly_654123/article/details/82724218)
上一篇文章接入微信公众平台的时候用的是GET请求来校验我们写的方法。而当我们接收消息的时候,微信发送的是POST请求,并以XML的格式发送与接收数据。
消息接收与响应的详情请参考官方开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
由官方文档可以看到微信给我们发送的消息是xml结构的,下面是普通文本消息的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> </xml>
|
其中,各标签所包含的内容,在官方文档中说的很详细:
因为微信发送的消息是POST请求,所以我们就在上篇文章的servlet中编写doPost方法以接收微信发送的内容,因为微信给我们发送的内容是xml结构,所以我们需要将xml结构的类型转换成我们熟悉的集合类型。反之,可以将我们熟悉的集合类型转换成xml结构类型,并返回给微信公众平台。
项目结构:
- 将接收的xml结构类型转换成集合对象map类型
创建一个新的工具类MessageUtil 需要的jar包dom4j和xstream
/**
* 将xml类型转换为Map类型
* @Title: xmlToMap
* @Description: TODO
* @param: @param request
* @param: @return
* @param: @throws Exception
* @return: Map<String,String>
* @throws
*/
@SuppressWarnings("unchecked")
public static Map<String,String> xmlToMap(HttpServletRequest req) throws Exception {
Map<String, String> map = new HashMap<String,String>();
//从dom4j的jar包中,拿到SAXReader对象
SAXReader reader = new SAXReader();
//从request中获取输入流
InputStream stream = req.getInputStream();
//从reader对象中,读取输入流
Document doc = reader.read(stream);
//获取xml文档的根元素
Element root = doc.getRootElement();
//获得根元素下的所有节点
List<Element> list = root.elements();
//遍历list对象,并将结果存到集合中
for (Element e : list) {
map.put(e.getName(), e.getText());
}
stream.close();
return map;
}
/**
* 将text消息对象转为xml
* @Title: textMessageToXml
* @Description: TODO
* @param: @param textMessage
* @param: @return
* @return: String
* @throws
*/
public static String textMessageToXml (TextMessage textMessage) {
XStream xstream = new XStream();
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}
TextMessage类
private String ToUserName;
private String FromUserName;
private String CreateTime;
private String MsgType;
private String Content;
private String MsgId;
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 String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
WeiXinServlet类:新增doPost方法
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
String str = null;
try {
Map<String, String> map = MessageUtil.xmlToMap(req);//将接收的消息转换为map类型
String toUserName = map.get("ToUserName");
String fromUserName = map.get("FromUserName");
String createTime = map.get("CreateTime");
String msgType = map.get("MsgType");
String content = map.get("Content");
String msgId = map.get("MsgId");
if("text".equals(msgType)) { //判断是否是文本类型
TextMessage message = new TextMessage();
message.setFromUserName(toUserName); //原来接收消息用户变为发送消息用户
message.setToUserName(fromUserName);
message.setCreateTime(new Date().getTime()+"");
message.setMsgType("text");
message.setContent("你好:"+fromUserName+"\n我是:"+toUserName
+"\n你发送的消息类型是:"+msgType
+"\n你发送的内容是:"+content
+"\n你发送的时间为:"+createTime
+"\n我回复的时间为:"+message.getCreateTime()
+"\n消息id是:"+msgId
);
str = MessageUtil.textMessageToXml(message);//将发送的消息对象转换为xml字符串
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.print(str);
out.close();
}
这样我们就成功的完成了文本消息的接收和发送了。效果如下:
首先进入微信公众平台,点击左侧【开发——开发者工具】,选择【公众平台测试账号】找到测试号二维码扫描关注: