安全模式下的消息格式:
new_msg= <xml> <ToUserName><![CDATA[toUser]]</ToUserName> <Encrypt><![CDATA[msg_encrypt]]</Encrypt> </xml>
现有消息格式:
msg= <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
加密后消息格式:
new_msg= <xml> <Encrypt><![CDATA[msg_encrypt]]></Encrypt> <MsgSignature><![CDATA[msg_signature]]></MsgSignature> <TimeStamp>timestamp</TimeStamp> <Nonce><![CDATA[nonce]]></Nonce> </xml>
代码如下:
public static HashMap<String,String> parseXMLCrypt(HttpServletRequest request) throws Exception { HashMap<String,String> map = new HashMap<String,String>(); /** * 第1步:获取加密的xml文本 */ InputStream is = request.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = null; StringBuffer buffer = new StringBuffer(); while((line = br.readLine()) != null) { buffer.append(line); } /** * 第2步:解密 */ String msgSignature = request.getParameter("msg_signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String fromXML = MessageUtil.getWxCrypt().decryptMsg(msgSignature,timestamp,nonce,buffer.toString()); /** * 第3步:解析xml文本 */ // 通过IO获得Document Document doc = DocumentHelper.parseText(fromXML); // 得到xml的根节点 Element root = doc.getRootElement(); recursiveParseXML(root,map); return map; } public static void recursiveParseXML(Element root,HashMap<String,String> map) { // 得到根节点的子节点列表 List<Element> elementList = root.elements(); if (elementList.size() == 0) { map.put(root.getName(),root.getTextTrim()); } else { for (Element e : elementList) { recursiveParseXML(e,map); } } }