zoukankan      html  css  js  c++  java
  • 微信解析并响应数据

    /**
         * 将微信服务器返回过来的数据转换为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     }
  • 相关阅读:
    专业工具,网络随行
    大话设计模式C++实现-文章7章-代理模式
    socket抓取网页
    Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
    Android系统Surface机制的SurfaceFlinger服务的启动过程分析
    Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
    Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
    Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
    Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析
    Android应用程序与SurfaceFlinger服务的连接过程分析
  • 原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4129278.html
Copyright © 2011-2022 走看看