微信解析并响应数据

/**
     * 将微信服务器返回过来的数据转换为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 微信用户请求xml
136      * @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/>"), "
").replaceAll(Pattern.quote("<br>"), "
"));
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     }
原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4129278.html