Java微信二次开发(五)

消息加密

需要到入库:commons-io-2.4.jar,commons-codec-1.9.jar(在官网的Java微信加密demo下)

第一步:访问https://mp.weixin.qq.com/wiki,下载AES加密的示例代码

第二步:新建com.wtz.aes包,把实例代码中的8个AES加密类复制进去,将这些类的包名改为com.wtz.aes,导入库commons-codec-1.9.jar,选上面的Project下的Properties,点击Java Build Path,Libraries,Add Library,选Junit 4,Next,Finish,OK,AES加密导入完成

第三步:找到包com.wtz.util,新建类Parameter.java类,存放参数token,encodingAESKey(随机戳),corpId(AppID),这些在基本配置处可以得到

 1 package com.wtz.util;
 2
 3 /**
 4  *     @author wangtianze QQ:864620012
 5  *    @date 2017年4月21日 下午9:27:50
 6  *  <p>version:1.0</p>
 7  *     <p>description:参数api</p>
 8  */
 9 public class Parameter {
10     //token
11     public static String token = "wangtianze";
12     //随机戳
13     public static String encodingAESKey = "X78dYU3MXpijKArRbiozTRq0jZZnjxxvuB4n8KJwRH1";
14     //应用AppID
15     public static String corpId = "wx9621c31e147dfdf9";
16 }

第四步:找到包com.wtz.util下的MessageUtil.java类,修改parseXml方法

  1 package com.wtz.util;
  2
  3 import java.io.ByteArrayInputStream;
  4 import java.io.IOException;
  5 import java.io.InputStream;
  6 import java.io.Writer;
  7 import java.util.HashMap;
  8 import java.util.List;
  9 import java.util.Map;
 10
 11 import javax.servlet.http.HttpServletRequest;
 12
 13 import org.dom4j.Document;
 14 import org.dom4j.DocumentException;
 15 import org.dom4j.Element;
 16 import org.dom4j.io.SAXReader;
 17
 18 import com.thoughtworks.xstream.XStream;
 19 import com.thoughtworks.xstream.core.util.QuickWriter;
 20 import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
 21 import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
 22 import com.thoughtworks.xstream.io.xml.XppDriver;
 23 import com.wtz.message.response.ImageMessage;
 24 import com.wtz.message.response.MusicMessage;
 25 import com.wtz.message.response.NewsMessage;
 26 import com.wtz.message.response.TextMessage;
 27 import com.wtz.message.response.VideoMessage;
 28 import com.wtz.message.response.VoiceMessage;
 29
 30 /**
 31  *     @author wangtianze QQ:864620012
 32  *    @date 2017年4月19日 下午3:29:58
 33  *  <p>version:1.0</p>
 34  *     <p>description:消息处理工具类</p>
 35  */
 36 public class MessageUtil {
 37     //请求消息类型:文本
 38     public static final String REQ_MESSAGE_TYPE_TEXT = "text";
 39     //请求消息类型:图片
 40     public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
 41     //请求消息类型:语音
 42     public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
 43     //请求消息类型:视频
 44     public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
 45     //请求消息类型:地理位置
 46     public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
 47     //请求消息类型:链接
 48     public static final String REQ_MESSAGE_TYPE_LINK = "link";
 49     //请求消息类型:事件推送
 50     public static final String REQ_MESSAGE_TYPE_EVENT = "event";
 51
 52     //---------------------------------------------------------------
 53
 54     //事件类型:subscribe(订阅)
 55     public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
 56     //事件类型:unsubscribe(取消订阅)
 57     public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
 58     //事件类型:scan(用户已关注时的扫描带参数的二维码)
 59     public static final String EVENT_TYPE_SCAN = "scan";
 60     //事件类型:LOCATION(上报地理位置)
 61     public static final String EVENT_TYPE_LOCATION = "LOCATION";
 62     //事件类型:CLICK(自定义菜单)
 63     public static final String EVENT_TYPE_CLICK = "CLICK";
 64
 65     //---------------------------------------------------------------
 66
 67     //响应消息类型:文本
 68     public static final String RESP_MESSAGE_TYPE_TEXT = "text";
 69     //响应详细类型:图片
 70     public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
 71     //响应消息类型:语音
 72     public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
 73     //响应消息类型:视频
 74     public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
 75     //响应详细类型:音乐
 76     public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
 77     //响应消息类型:图文
 78     public static final String RESP_MESSAGE_TYPE_NEWS = "news";
 79
 80     //---------------------------------------------------------------
 81
 82     //-----------------------------------------老的,加密前---------------------------------------------
 83 //    //从流中解析出每个节点的内容
 84 //    public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{
 85 //        Map<String,String> map = new HashMap<String,String>();
 86 //
 87 //        //从输入流中获取流对象
 88 //        InputStream in = request.getInputStream();
 89 //
 90 //        //构建SAX阅读器对象
 91 //        SAXReader reader = new SAXReader();
 92 //        try {
 93 //            //从流中获得文档对象
 94 //            Document doc = reader.read(in);
 95 //
 96 //            //获得根节点
 97 //            Element root = doc.getRootElement();
 98 //
 99 //            //获取根节点下的所有子节点
100 //            List<Element> children = root.elements();
101 //
102 //            for(Element e:children){
103 //                //遍历每一个节点,并按照节点名--节点值放入map中
104 //                map.put(e.getName(), e.getText());
105 //                System.out.println("用户发送的消息XML解析为:" + e.getName() + e.getText());
106 //            }
107 //
108 //            //关闭流
109 //            in.close();
110 //            in = null;
111 //        } catch (DocumentException e) {
112 //            // TODO Auto-generated catch block
113 //            e.printStackTrace();
114 //        }
115 //
116 //        return map;
117 //    }
118     //-----------------------------------------新的,加密后--------------------------------------------
119   //从流中解析出每个节点的内容
120     public static Map<String,String> parseXml(String request) throws IOException{
121         Map<String,String> map = new HashMap<String,String>();
122
123         //从request中获取流对象
124         InputStream in = new ByteArrayInputStream(request.getBytes("UTF-8"));
125
126         //构建SAX阅读器对象
127         SAXReader reader = new SAXReader();
128         try {
129             //从流中获得文档对象
130             Document doc = reader.read(in);
131
132             //获得根节点
133             Element root = doc.getRootElement();
134
135             //获取根节点下的所有子节点
136             List<Element> children = root.elements();
137
138             for(Element e:children){
139                 //遍历每一个节点,并按照节点名--节点值放入map中
140                 map.put(e.getName(), e.getText());
141                 System.out.println("用户发送的消息XML解析为:" + e.getName() + e.getText());
142             }
143
144             //关闭流
145             in.close();
146             in = null;
147         } catch (DocumentException e) {
148             // TODO Auto-generated catch block
149             e.printStackTrace();
150         }
151
152         return map;
153     }
154     //----------------------------------------------------------------------------------------------
155
156     /**
157      * 用于扩展节点数据按照<ToUserName><![CDATA[toUser]]></ToUserName>,中间加了CDATA段
158      */
159     private static XStream xstream = new XStream(new XppDriver(){
160         public HierarchicalStreamWriter createWriter(Writer out){
161             return new PrettyPrintWriter(out){
162                 boolean cdata = true;
163                 public void startNode(String name,Class clazz){
164                     super.startNode(name,clazz);
165                 }
166
167                 protected void writeText(QuickWriter writer,String text){
168                     if(cdata){
169                         writer.write("<![CDATA[");
170                         writer.write(text);
171                         writer.write("]]>");
172                     }else{
173                         writer.write(text);
174                     }
175                 }
176             };
177         }
178     });
179
180     /**
181      * 将文本消息对象转换成XML格式
182      * params:textMessage 文本消息对象
183      * return:xml
184      */
185     public static String messageToXml(TextMessage textMessage){
186         xstream.alias("xml",textMessage.getClass());
187         return xstream.toXML(textMessage);
188     }
189
190     /**
191      * 将图片消息对象转换成XML格式
192      * params:imageMessage
193      * return:xml
194      */
195     public static String messageToXml(ImageMessage imageMessage){
196         xstream.alias("xml", imageMessage.getClass());
197         return xstream.toXML(imageMessage);
198     }
199
200     /**
201      * 将语音消息对象转换成XML格式
202      * params:voiceMessage
203      * return:xml
204      */
205     public static String messageToXml(VoiceMessage voiceMessage){
206         xstream.alias("xml",voiceMessage.getClass());
207         return xstream.toXML(voiceMessage);
208     }
209
210     /**
211      * 将视频消息对象转换成XML格式
212      * params:videoMessage
213      * return:xml
214      */
215     public static String messageToXml(VideoMessage videoMessage){
216         xstream.alias("xml",videoMessage.getClass());
217         return xstream.toXML(videoMessage);
218     }
219
220     /**
221      * 将音乐消息对象转换成XML格式
222      * params:musicMessage
223      * return:xml
224      */
225     public static String messageToXml(MusicMessage musicMessage){
226         xstream.alias("xml",musicMessage.getClass());
227         return xstream.toXML(musicMessage);
228     }
229
230     /**
231      * 将图文消息对象转换成XML格式
232      * params:newsMessage
233      * return:xml
234      */
235     public static String messageToXml(NewsMessage newsMessage){
236         xstream.alias("xml",newsMessage.getClass());
237         return xstream.toXML(newsMessage);
238     }
239 }

第五步:找到包com.wtz.util下的ProcessService.java类,修改dealRequest方法

  1 package com.wtz.util;
  2
  3 import java.io.IOException;
  4 import java.util.Date;
  5 import java.util.Map;
  6
  7 import javax.servlet.http.HttpServletRequest;
  8
  9 import com.wtz.dao.PostCodeDao;
 10 import com.wtz.message.response.TextMessage;
 11
 12 /**
 13  *     @author wangtianze QQ:864620012
 14  *    @date 2017年4月19日 下午8:04:14
 15  *  <p>version:1.0</p>
 16  *     <p>description:核心服务类</p>
 17  */
 18 public class ProcessService {
 19     //定义数据访问的dao
 20     private static PostCodeDao dao = new PostCodeDao();
 21
 22     //-----------------------------------老的,加密前--------------------------------------------------
 23 //    public static String dealRequest(HttpServletRequest request){
 24 //        //XML格式的消息数据
 25 //        String respXml = "";
 26 //        //默认返回的文本消息内容
 27 //        String respContent = "未知的消息类型";
 28 //        //调用parseXml方法解析请求消息
 29 //        Map<String, String> requestMap;
 30 //        try {
 31 //            requestMap = MessageUtil.parseXml(request);
 32 //            //发送方账号
 33 //            String fromUserName = requestMap.get("FromUserName");
 34 //            //开发者微信号
 35 //            String toUserName = requestMap.get("ToUserName");
 36 //            //消息类型
 37 //            String MsgType = requestMap.get("MsgType");
 38 //            //消息内容
 39 //            String content = requestMap.get("Content");
 40 //
 41 //            //回复文本消息
 42 //            TextMessage textMessage = new TextMessage();
 43 //            textMessage.setToUserName(fromUserName);
 44 //            textMessage.setFromUserName(toUserName);
 45 //            textMessage.setCreateTime(new Date().getTime());
 46 //            textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
 47 //
 48 //            if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
 49 //                respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
 50 //                if(content.equals("1")){
 51 //                    respContent = "请按照格式输入地区名,例如输入 邮编:东城";
 52 //                }
 53 //                if(content.equals("2")){
 54 //                    respContent = "请按照格式输入地区名,例如输入 区号:东城";
 55 //                }
 56 //                if(content.equals("?")){
 57 //                    respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
 58 //                }
 59 //                if(content.startsWith("邮编:")){
 60 //                    int pos = content.indexOf(":");
 61 //                    String cityName = content.substring(pos + 1);
 62 //                    respContent = dao.findPostCodeByCityName(cityName);
 63 //                    System.out.println("邮编:respContent:" + respContent);
 64 //                }
 65 //                if(content.startsWith("区号:")){
 66 //                    int pos = content.indexOf(":");
 67 //                    String cityName = content.substring(pos + 1);
 68 //                    respContent = dao.findTelCodeByCityName(cityName);
 69 //                    System.out.println("区号:respContent:" + respContent);
 70 //                }
 71 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){
 72 //                respContent = "您发送的是图片消息";
 73 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
 74 //                respContent = "您发送的是语音消息";
 75 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){
 76 //                respContent = "您发送的是视频消息";
 77 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){
 78 //                respContent = "您发送的是地理位置消息";
 79 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){
 80 //                respContent = "您发送的是链接消息";
 81 //            }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
 82 //                //事件类型
 83 //                String eventType = requestMap.get("Event");
 84 //                if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
 85 //                    respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
 86 //                }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
 87 //                    //TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
 88 //                }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
 89 //                    //TODO 处理扫描带参数二维码事件
 90 //                }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){
 91 //                    //TODO 处理上报地理位置事件
 92 //                }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
 93 //                    //TODO 处理菜单点击事件
 94 //                }
 95 //            }
 96 //            //设置文本消息的内容
 97 //            textMessage.setContent(respContent);
 98 //            //将文本消息对象转换成xml
 99 //            respXml = MessageUtil.messageToXml(textMessage);
100 //        } catch (IOException e) {
101 //            // TODO Auto-generated catch block
102 //            e.printStackTrace();
103 //        }
104 //
105 //        return respXml;
106 //    }
107
108     //----------------------------------------------新的,加密后---------------------------------------------
109     public static String dealRequest(String request){
110         //XML格式的消息数据
111         String respXml = "";
112         //默认返回的文本消息内容
113         String respContent = "未知的消息类型";
114         //调用parseXml方法解析请求消息
115         Map<String, String> requestMap;
116         try {
117             requestMap = MessageUtil.parseXml(request);
118             //发送方账号
119             String fromUserName = requestMap.get("FromUserName");
120             //开发者微信号
121             String toUserName = requestMap.get("ToUserName");
122             //消息类型
123             String MsgType = requestMap.get("MsgType");
124             //消息内容
125             String content = requestMap.get("Content");
126
127             //回复文本消息
128             TextMessage textMessage = new TextMessage();
129             textMessage.setToUserName(fromUserName);
130             textMessage.setFromUserName(toUserName);
131             textMessage.setCreateTime(new Date().getTime());
132             textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
133
134             if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
135                 respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
136                 if(content.equals("1")){
137                     respContent = "请按照格式输入地区名,例如输入 邮编:东城";
138                 }
139                 if(content.equals("2")){
140                     respContent = "请按照格式输入地区名,例如输入 区号:东城";
141                 }
142                 if(content.equals("?")){
143                     respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
144                 }
145                 if(content.startsWith("邮编:")){
146                     int pos = content.indexOf(":");
147                     String cityName = content.substring(pos + 1);
148                     respContent = dao.findPostCodeByCityName(cityName);
149                     System.out.println("邮编:respContent:" + respContent);
150                 }
151                 if(content.startsWith("区号:")){
152                     int pos = content.indexOf(":");
153                     String cityName = content.substring(pos + 1);
154                     respContent = dao.findTelCodeByCityName(cityName);
155                     System.out.println("区号:respContent:" + respContent);
156                 }
157             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){
158                 respContent = "您发送的是图片消息";
159             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
160                 respContent = "您发送的是语音消息";
161             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){
162                 respContent = "您发送的是视频消息";
163             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){
164                 respContent = "您发送的是地理位置消息";
165             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){
166                 respContent = "您发送的是链接消息";
167             }else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
168                 //事件类型
169                 String eventType = requestMap.get("Event");
170                 if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
171                     respContent = "感谢您关注【王天泽的服务号】\n" + "微信号:wangtianze1\n" + "请回复序号:\n" + "1.查邮政编码\n" + "2.查电话区号\n" + "?.返回帮助菜单\n";
172                 }else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
173                     //TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
174                 }else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
175                     //TODO 处理扫描带参数二维码事件
176                 }else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){
177                     //TODO 处理上报地理位置事件
178                 }else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
179                     //TODO 处理菜单点击事件
180                 }
181             }
182             //设置文本消息的内容
183             textMessage.setContent(respContent);
184             //将文本消息对象转换成xml
185             respXml = MessageUtil.messageToXml(textMessage);
186         } catch (IOException e) {
187             // TODO Auto-generated catch block
188             e.printStackTrace();
189         }
190
191         return respXml;
192     }
193 }

第六步:找到包com.wtz.service,修改LoginServlet.java类,修改doPost方法

  1 package com.wtz.service;
  2
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5 import java.io.PrintWriter;
  6
  7 import javax.servlet.ServletException;
  8 import javax.servlet.http.HttpServlet;
  9 import javax.servlet.http.HttpServletRequest;
 10 import javax.servlet.http.HttpServletResponse;
 11
 12 import org.apache.commons.io.IOUtils;
 13
 14 import com.wtz.aes.AesException;
 15 import com.wtz.aes.WXBizMsgCrypt;
 16 import com.wtz.util.MessageUtil;
 17 import com.wtz.util.Parameter;
 18 import com.wtz.util.ProcessService;
 19 import com.wtz.util.ValidationUtil;
 20
 21 /**
 22  *     @author wangtianze QQ:864620012
 23  *    @date 2017年4月17日 下午8:11:32
 24  *  <p>version:1.0</p>
 25  *     <p>description:微信请求验证类</p>
 26  */
 27 public class LoginServlet extends HttpServlet {
 28
 29     @Override
 30     protected void doGet(HttpServletRequest request, HttpServletResponse response)
 31             throws ServletException, IOException {
 32         System.out.println("get请求。。。。。。");
 33
 34         //1.获得微信签名的加密字符串
 35         String signature = request.getParameter("signature");
 36
 37         //2.获得时间戳信息
 38         String timestamp = request.getParameter("timestamp");
 39
 40         //3.获得随机数
 41         String nonce = request.getParameter("nonce");
 42
 43         //4.获得随机字符串
 44         String echostr = request.getParameter("echostr");
 45
 46         System.out.println("获得微信签名的加密字符串:"+signature);
 47         System.out.println("获得时间戳信息:"+timestamp);
 48         System.out.println("获得随机数:"+nonce);
 49         System.out.println("获得随机字符串:"+echostr);
 50
 51         PrintWriter out = response.getWriter();
 52
 53         //验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则失败
 54         if(ValidationUtil.checkSignature(signature, timestamp, nonce)){
 55             out.print(echostr);
 56         }
 57
 58         out.close();
 59         out = null;
 60     }
 61
 62     /**
 63      * 接受微信服务器发过来的XML数据包(通过post请求发送过来的)
 64      */
 65     @Override
 66     protected void doPost(HttpServletRequest request, HttpServletResponse response)
 67             throws ServletException, IOException {
 68         //将请求响应的编码均设置为UTF-8,防止中文乱码
 69         request.setCharacterEncoding("UTF-8");
 70         response.setCharacterEncoding("UTF-8");
 71
 72         //------------------------老的,不加密----------------------------
 73 //        //获取微信加密的签名字符串
 74 //        String signature = request.getParameter("signature");
 75 //
 76 //        //获取时间戳
 77 //        String timestamp = request.getParameter("timestamp");
 78 //
 79 //        //获取随机数
 80 //        String nonce = request.getParameter("nonce");
 81 //
 82 //        PrintWriter out = response.getWriter();
 83 //
 84 //        if(ValidationUtil.checkSignature(signature,timestamp,nonce)){
 85 //            String respXml = "";
 86 //            try {
 87 //                respXml = ProcessService.dealRequest(request);
 88 //            } catch (Exception e) {
 89 //                // TODO Auto-generated catch block
 90 //                e.printStackTrace();
 91 //            }
 92 //            out.print(respXml);
 93 //        }
 94 //        out.close();
 95 //        out = null;
 96         //---------------------------新的,加密---------------------------
 97         //获取微信加密的签名字符串
 98         String signature = request.getParameter("msg_signature");
 99
100         //获取时间戳
101         String timestamp = request.getParameter("timestamp");
102
103         //获取随机数
104         String nonce = request.getParameter("nonce");
105
106         //从请求中读取整个post数据
107         InputStream inputStream = request.getInputStream();
108
109         //commons.io.jar方法,直接将流转成字符串
110         String Post = IOUtils.toString(inputStream,"UTF-8");
111
112         System.out.println("Post:" + Post);
113
114         String Msg = "";
115         WXBizMsgCrypt wxcpt = null;
116         try {
117             wxcpt = new WXBizMsgCrypt(Parameter.token,Parameter.encodingAESKey,Parameter.corpId);
118             //解密消息
119             Msg = wxcpt.decryptMsg(signature,timestamp,nonce,Post);
120         } catch (AesException e) {
121             // TODO Auto-generated catch block
122             e.printStackTrace();
123         }
124         //Msg打印结果
125         System.out.println("Msg打印结果:" + Msg);
126
127         //调用核心业务类接收消息,处理消息
128         String respMessage = ProcessService.dealRequest(Msg);
129
130         //respMessage打印结果
131         System.out.println("respMessage打印结果:" + respMessage);
132
133         String encryptMsg = "";
134         try {
135             //加密回复消息
136             encryptMsg = wxcpt.encryptMsg(respMessage, timestamp, nonce);
137             System.out.println("encryptMsg:" + encryptMsg);
138         } catch (AesException e) {
139             // TODO Auto-generated catch block
140             e.printStackTrace();
141         }
142
143         //响应消息
144         PrintWriter out = response.getWriter();
145         out.print(encryptMsg);
146         out.close();
147     }
148 }

消息加密完成。

时间: 2024-10-11 11:22:48

Java微信二次开发(五)的相关文章

Java微信公众平台开发(五)--文本及图文消息回复的实现

上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为[普通消息]和[多媒体消息],这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段[openid],它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字! (一)回复文本消息 在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在[文本消息]类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToU

java微信二次第三方开发,token认证,消息事件接收,图文素材库,自定义菜单等功能

基于之前的文章SSM配置的项目:http://www.cnblogs.com/mangyang/p/5168291.html 来进行微信第三方开发, 微信二次开发,官方还是网上有很多介绍了,这里就不在进行讲述了 直接上干货. 首先 与微信对接,服务器配置,需要80端口和443端口开放的服务器,这里推荐 使用 python 的pagekite,一款反向代理的工具,具体安装百度搜,提供下配置放方法:http://jingyan.baidu.com/article/0eb457e52ca0af03f0

Java微信公众平台开发模式+自定义按钮源码

首先,想用开放模式需要先成为开发者.成为开发者有两种写法. 一是:通过jsp页面,用out.print("echostr")//SHA1加密的字符串: 二是:通过Servlet.doGet返回exhostr,给微信平台. 这里我只写第二种方式的请求(这里的请求是以get方式请求),代码如下: import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.ut

(7)微信二次开发 之 微信接口凭证的获取

p.p1 { margin: 13.0px 0.0px 13.0px 0.0px; text-align: justify; font: 16.0px SimSun } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px SimSun } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: justify; font: 10.5px "Times N

Java微信公众平台开发_02_启用服务器配置

一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册:(https://mp.weixin.qq.com/) 3.策略文件 见:[ Java企业微信开发_Exception_02_java.security.InvalidKeyException: Illegal key size ] 4.微信官方消息加解密工具包 需要下载微信官方的消息加解密的工具包,主要是AES加密工具 下载地址:

Java微信公众平台开发--番外篇,对GlobalConstants文件的补充

转自:http://www.cuiyongzhi.com/post/63.html 之前发过一个[微信开发]系列性的文章,也引来了不少朋友观看和点评交流,可能我在写文章时有所疏忽,对部分文件给出的不是很完全所以导致部分同学在有些地方做开发的时候遇到了一些阻力,收到这些朋友同学们的咨询反馈之后我也做了一些反思和总结,其中一部分同学说少了GlobalConstants这个文件(这个真心占的不少),还有一部分就是说源码的问题,所以今天特意抽了时间补充下这两点! (一)关于GlobalConstants

微信二次开发sdk使用教程--手机微信上回复好友的聊天消息通知服务端

微信二次开发sdk使用教程--手机微信上回复好友的聊天消息通知服务端 case WeChatTalkToFriendNotice: {// 手机上回复好友的聊天消息 log.debug("socket:msgtype=WeChatTalkToFriendNotice"); weChatTalkToFriendNoticeHandler.handleMsg(ctx, msgVo); break; } package com.jubotech.framework.netty.handler

微信二次开发SDK

微信二次开发sdk,微信开发sdk,云控微信开发SDK 服务端调用接口目录 1.基础消息类型 1.客户端发送的心跳包 HeartBeatReq = 1001; 2.消息接收确认回复(接收或拒绝接收) MsgReceivedAck = 1002; 3.错误单独提升为一种消息类型 Error = 1003; 2.设备客户端授权类消息 1.设备(手机客户端.客服客户端)获取通信token请求 DeviceAuthReq = 1010; 2.设备(手机客户端.客服客户端)获取通信token响应 Devi

java微信公众平台开发事件推送

import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import com.ifp.weixin.biz.cor