微信服务器发过来的消息进行解析处理。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
// 调用核心业务类接收消息、处理消息
String respMessage = null;
try {
respMessage = processReqest.process(request,response);
} catch (Exception e) {
e.printStackTrace();
}
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}
}
post方法
用户发过来的消息主要有1 文本消息2 图片消息3 语音消息4 视频消息5小视频消息6 地理位置消息7 链接消息。我们从request中拿到微信服务器发过来
的数据,由于发过来的是xml格式的数据(具体的形式,可以查看微信公众平台开发者文档),解析xml方法有很多,这里我们用Dom4j进
行xml的解析,并将解析的结果封装在map集合中。
//从request中拿到xml并封装在map中
public class RequestXML2Map {
public static Map parseXml(HttpServletRequest request) throws Exception {
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
StringBuffer sb = new StringBuffer();
InputStream is = request.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String s = "";
while ((s = br.readLine()) != null) {
sb.append(s);
}
String xml = sb.toString();
// 读取输入流
Document document = null;
try {
document = DocumentHelper.parseText(xml);
} catch (DocumentException e1) {
e1.printStackTrace();
}
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList) {
// 对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。
map.put(e.getName(), e.getText());
}
return map;
}
}
XML解析
通过上面的过程,我们已经完成了对微信服务器发送过来的数据封装,下面就是根据用户发送过来的消息进行回复,这里主要完成
回复文本消息。我们从之前解析好的map集合中得到用户发过来消息的类型,根据用户发过来消息的类型做出相应的回复,当然这里只
回复基本的文本消息,以后还会完成其他消息的回复。
public class processReqest {
public static String process(HttpServletRequest request,HttpServletResponse response) throws Exception{
@SuppressWarnings("unchecked")
Map<String, String> map = RequestXML2Map.parseXml(request);
String result = "";
String msgType = map.get("MsgType");
String respContent = "";
//文本消息
if (msgType.equals("text")) {
respContent = TulingRobot.robot(map.get("Content"));
TextMessage textMessage = Map2Bean.parseText(map,respContent);
result = Bean2ResponseXML.textMessageToXml(textMessage);
}
//图片消息
else if (msgType.equals("image")) {
respContent = "";
return null;
}
//声音消息
else if (msgType.equals("voice")) {
respContent = "";
return null;
}
//视频消息
else if (msgType.equals("video")) {
respContent = "";
return null;
}
//地理位置
else if (msgType.equals("location")) {
respContent = "";
return null;
}
//事件类型
else if (msgType.equals("event")) {
String eventType = map.get("Event");
//订阅
if (eventType.equals("subscribe")) {
respContent = "欢迎订阅我的公众号!";
TextMessage textMessage = Map2Bean.parseText(map,respContent);
result = Bean2ResponseXML.textMessageToXml(textMessage);
}
//取消订阅
else if (eventType.equals("unsubscribe")) {
// TODO
return null;
}
//点击菜单
else if (eventType.equals("CLICK")) {
// TODO
return null;
}
}
return result;
}
}