首页 > 代码库 > 微信解析并响应数据

微信解析并响应数据

/**     * 将微信服务器返回过来的数据转换为xml     * @param request     * @return     */    public static String readXMLFromRequestBody(HttpServletRequest request) {        StringBuffer xml = new StringBuffer();        xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");        String line = null;        try {            BufferedReader reader = request.getReader();            while ((line = reader.readLine()) != null) {                xml.append(line);            }        } catch (Exception e) {            e.printStackTrace();        }        return xml.toString();    }

微信XML解析器

  1 package com.util;  2   3 import java.io.ByteArrayInputStream;  4 import java.io.UnsupportedEncodingException;  5 import java.util.regex.Pattern;  6   7 import javax.xml.parsers.DocumentBuilderFactory;  8   9 import org.w3c.dom.DOMException; 10 import org.w3c.dom.Document; 11 import org.w3c.dom.Element; 12 import org.w3c.dom.NodeList; 13  14 /** 15  * 微信返回XML的解析器 16  * @author chuanyuBai 17  * 18  */ 19 public class XMLParser { 20      21     protected String mXMLContent; 22     protected String mEncodeType; 23     protected Document mXmlDoc = null; 24     protected NodeList mXmlNodeList = null; 25     protected Element mXmlNode = null;     26     public XMLParser(String xmlContent,String encodeType){ 27         mXMLContent = xmlContent; 28         mEncodeType = encodeType; 29         LoadXMLDocument(); 30     } 31      32     public String getMsgType(){ 33         return mXmlNode.getElementsByTagName("MsgType").item(0).getFirstChild().getNodeValue(); 34     } 35      36     public String getSessionID(){ 37         return mXmlNode.getElementsByTagName("FromUserName").item(0).getFirstChild().getNodeValue(); 38     } 39      40     public String getUserName(){ 41         return mXmlNode.getElementsByTagName("ToUserName").item(0).getFirstChild().getNodeValue(); 42     } 43      44     public String getCreateTime(){ 45         return mXmlNode.getElementsByTagName("CreateTime").item(0).getFirstChild().getNodeValue(); 46     } 47      48     public double[] getLocation(){ 49         double[] location = new double[2]; 50         String slongitude = mXmlNode.getElementsByTagName("Location_Y").item(0).getFirstChild().getNodeValue(); 51         String slatitude = mXmlNode.getElementsByTagName("Location_X").item(0).getFirstChild().getNodeValue(); 52         location[0] = Double.parseDouble(slongitude); 53         location[1] = Double.parseDouble(slatitude); 54         return location; 55     } 56     public String getMsgText() 57     { 58         String question = ""; 59         if(mEncodeType == null || (mEncodeType!=null && !mEncodeType.equals("UTF-8"))){ 60             try { 61                 question = new String(mXmlNode.getElementsByTagName("Content").item(0).getFirstChild().getNodeValue().getBytes("iso-8859-1"), "UTF-8"); 62             }  63             catch (UnsupportedEncodingException | DOMException e) { 64                 e.printStackTrace(); 65             } 66         } 67         else{ 68             question = mXmlNode.getElementsByTagName("Content").item(0).getFirstChild().getNodeValue(); 69         } 70         if(question.startsWith("/")) 71             question="你好"; 72         return question; 73     } 74      75     public String getMsgRecognization(){ 76         String question = ""; 77         if(mEncodeType == null || (mEncodeType!=null && !mEncodeType.equals("UTF-8"))){ 78             try{ 79                 question = new String(mXmlNode.getElementsByTagName("Recognition").item(0).getFirstChild().getNodeValue().getBytes("iso-8859-1"), "UTF-8"); 80             }  81             catch (UnsupportedEncodingException | DOMException e) { 82                 e.printStackTrace(); 83             } 84         } 85         else{ 86             question = mXmlNode.getElementsByTagName("Recognition").item(0).getFirstChild().getNodeValue(); 87         } 88         return question; 89     } 90      91     public String getEventType(){ 92         return mXmlNode.getElementsByTagName("Event").item(0).getFirstChild().getNodeValue(); 93     } 94      95     public String getEventKey(){             96         return mXmlNode.getElementsByTagName("EventKey").item(0).getFirstChild().getNodeValue(); 97     } 98      99     public double[] getGlobalLocation(){100         double[] location = new double[2];101         String slongitude = mXmlNode.getElementsByTagName("Longitude").item(0).getFirstChild().getNodeValue();102         String slatitude = mXmlNode.getElementsByTagName("Latitude").item(0).getFirstChild().getNodeValue();103         location[0] = Double.parseDouble(slongitude);104         location[1] = Double.parseDouble(slatitude);105         return location;106     }107     public String getMsgImage(){108         String question = "";109         question="你好";110         return question;111     }112     public String getMsgVideo(){113         String question = "";114         question="你好";115         return question;116     }117     public String getMsgLink(){118         String question = "";119         question="你好";120         return question;121     }    122     protected void LoadXMLDocument(){123         try 124         {               125             mXmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(mXMLContent.getBytes("UTF-8")));126         }catch(Exception e){127             e.printStackTrace(); 128         }129         mXmlNodeList = mXmlDoc.getElementsByTagName("xml");130         mXmlNode = (Element)mXmlNodeList.item(0);131     }    132     133     /**134      * 根据微信用户请求信息获取返回信息135      * @param xmlParser 微信用户请求xml136      * @return 返回给微信服务器的xml字符串137      */138     public static  String getResponseResult(XMLParser xmlParser) {139         StringBuffer sb = new StringBuffer();140         // 获取用户的问题141         try {142             String userAsk = "";143             144             switch(xmlParser.getMsgType().toLowerCase()) {145                 case "text":146                     userAsk = xmlParser.getMsgText();147                     sb.append("大家好");148                     break;149                 case "location":150                     double[] location = xmlParser.getLocation();151 152                     sb.append("精度:"+location[0]+" weidu:"+location[1]);153                     // 将当前信息发送给服务器154                     break;155                 case "voice":156                     userAsk = xmlParser.getMsgRecognization();157                     sb.append("你上传的是voice"+userAsk);158                     break;159                 case "image":160                     userAsk = xmlParser.getMsgImage();161                     sb.append("你上传的是image"+userAsk);162                     break;163                 case "video":164                     userAsk = xmlParser.getMsgVideo();165                     sb.append("你上传的是video"+userAsk);166                     break;167                 case "event":168                     String eventType = xmlParser.getEventType();169                     if ("click".equalsIgnoreCase(eventType)) {170                         String eventKey = xmlParser.getEventKey();171                         if (CommonUtil.isNotNull(eventKey)) {172                             userAsk = eventKey.trim();173                         } else {174                         }175                     } else if ("location".equalsIgnoreCase(eventType)) {176                     // 订阅177                     } else if ("subscribe".equalsIgnoreCase(eventType)) {178                         sb.append("nihao");179                     // 取消订阅180                     } else if ("unsubscribe".equalsIgnoreCase(eventType)) {181                     }182                     break;183                 default:184             }185         } catch (Exception e) {186             187         }188         String textTpl = "<MsgType><![CDATA[%s]]></MsgType>" +189                 "<Content><![CDATA[%s]]></Content>" +190                 "<FuncFlag>0</FuncFlag>";191         String content = String.format(textTpl,"text",sb.toString().replaceAll(Pattern.quote("<br/>"), "\n").replaceAll(Pattern.quote("<br>"), "\n"));192         String wechatXML = "<xml>" +193                 "<ToUserName><![CDATA[%s]]></ToUserName>" +194                 "<FromUserName><![CDATA[%s]]></FromUserName>" +195                 "<CreateTime>%s</CreateTime>" +196                 "%s"+197                 "</xml>";198         return String.format(wechatXML, xmlParser.getSessionID(),xmlParser.getUserName(),System.currentTimeMillis(),content);199     }200 }
 1 @Override 2     public String execute() throws Exception { 3         HttpServletRequest request = ServletActionContext.getRequest(); 4         StringBuffer sb = new StringBuffer(); 5         if ("get".equalsIgnoreCase(request.getMethod())) { 6             // 从数据库找到该token或者设置token为 固定值 7             String token = "baichuanyu"; 8             //1. 将token、timestamp、nonce三个参数进行字典序排序 9             //2. 将三个参数字符串拼接成一个字符串进行sha1加密10             //3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信11             //若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。12             String signature = request.getParameter("signature");13             String timestamp = request.getParameter("timestamp");14             String nonce = request.getParameter("nonce");15             String echostr = request.getParameter("echostr");    16             if(!checkSignature(signature,token,timestamp,nonce))17             {18                 echostr = "";            19             }        20             sb.append(echostr);21             this.inputStream = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));22         } else if("POST".equals(request.getMethod())){23             String msg = readXMLFromRequestBody(request);24             XMLParser xmlParser = new XMLParser(msg, request.getCharacterEncoding());25             // 获取答案26             String answer = XMLParser.getResponseResult(xmlParser);27             sb.append(answer);28             this.inputStream = new ByteArrayInputStream(sb.toString().getBytes("UTF-8"));29         }30         31         return SUCCESS;32     }

 

微信解析并响应数据