从微信开发文档中得出一个结论:在公众号上进行的任何操作,比如发送文本、图片、视频、语音消息等或者点击菜单某个按钮,微信服务器都会给绑定的URL发送一个带数据的request。
例如参考数据如下(因为我对map比较熟,所以格式已经从XML转化为map):
文本消息:
MsgId=6454514167540419126, FromUserName=xxxxxxxx, CreateTime=1502808688, Content=哈哈, ToUserName=xxxxxxxx, MsgType=text
点击带链接的菜单:
FromUserName=xxxxxxx, EventKey=http://www.baidu.com, Event=VIEW, CreateTime=1502808706, MenuId=435751363, ToUserName=xxxxx, MsgType=event
步骤总体来说有三步,如下:
1.数据格式从XML转化为map
所需jar包下载地址:
http://download.csdn.net/download/zhengyikuangge/9510313
代码如下:
/*
* XML解析,把request参数传入,调用该方法即可
*/
public static Map<String, String> parseXml(HttpServletRequest request)
throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// document.selectSingleNode("//")
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 释放资源
inputStream.close();
inputStream = null;
System.out.println("XML获取的信息为:" + map.toString());
return map;
}
2. 判断是服务器接入还是推送
注意要将该过程放在绑定URL的接收范围内,即servlet的doget或dopost方法内。
if (map == null) {
// 执行微信接入验证操作
} else {
// 执行消息处理操作
doMsg(map, resp);
// doMsg方法如下
}
3.结合获取的map判断
拿文本信息举例,代码如下
/*
* 消息处理
*/
public void doMsg(Map map, HttpServletResponse resp) throws IOException {
// 根据消息的种类
switch (map.get("MsgType").toString()) {
// 文字信息
case "text":
String reText = "";
if (map.get("Content").equals("你好")) {
reText = "<xml><ToUserName>" + "<![CDATA["
+ map.get("FromUserName") + "]]>"
+"</ToUserName>"
+ "<FromUserName><![CDATA[" + Common.amdin_acount
+ "]]>" + "</FromUserName>"
+ "<CreateTime>12345678</CreateTime>"
+ "<MsgType><![CDATA[text]]></MsgType>"
+ "<Content><![CDATA[你好]]></Content></xml>";
}
resp.getWriter().print(reText);
break;
default:
resp.getWriter().print("");
break;
}
}
执行结果为:在公众号中输入 “你好”则公众号返回“你好”