无标题文档
人多不足以依赖,要生存只有靠自己。
      深窥自己的心,而后发觉一切的奇迹在你自己。
          凡事皆有终结,因此,耐心是赢得成功的一种手段。

微信公众帐号开发教程第7篇-各种消息的接收与响应------- 此项目的源码在文章的末尾

欢迎加入群:114196246  进行讨论相互交流  我的微信号:572839485

我的微信公众账号  我的微社区欢迎关注 索取源码请点击

 

图床:没有服务器 拖拽图片 外网即可访问
http://2.crazyflower.duapp.com/home

 

前一篇文章里我们已经把微信公众平台接口中消息及相关操作都进行了封装,本章节将主要介绍如何接收微信服务器发送的消息并做出响应。

当用户向公众帐号发消息时,微信服务器会将消息通过POST方式提交给我们在接口配置信息中填写的URL,而我们就需要在URL所指向的请求处理类的doPost方法中接收消息、处理消息和响应消息。

接收、处理、响应消息

 

 

 1 package com.javen.course.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 import com.javen.course.service.CrazyService;
12 import com.javen.course.util.SignUtil;
13 
14 /**
15  * 核心请求处理类 
16  * @author Javen
17  * @Email zyw205@gmail.com
18  * 
19  */
20 public class CrazyServlet extends HttpServlet {
21 
22     private static final long serialVersionUID = -5021188348833856475L;
23     @Override
24     protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
25         // 微信加密签名  
26         String signature = request.getParameter("signature");  
27         // 时间戳  
28         String timestamp = request.getParameter("timestamp");  
29         // 随机数  
30         String nonce = request.getParameter("nonce");  
31         // 随机字符串  
32         String echostr = request.getParameter("echostr");  
33         PrintWriter out = response.getWriter();  
34         // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败  
35         if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
36             out.print(echostr);  
37         }  
38         out.close();
39         out = null;
40     }
41     
42     
43     @Override
44     protected void doPost(HttpServletRequest request, HttpServletResponse response)
45             throws ServletException, IOException {
46         // 将请求、响应的编码均设置为UTF-8(防止中文乱码)  
47         request.setCharacterEncoding("UTF-8");  
48         response.setCharacterEncoding("UTF-8"); 
49         // 调用核心业务类接收消息、处理消息  
50         String respMessage = CrazyService.processRequest(request);  
51           
52         // 响应消息  
53         PrintWriter out = response.getWriter();  
54         out.print(respMessage);
55         out.close();  
56     }
57 }

 

注意:

1)第54行代码:调用CrazyService类的processRequest方法接收、处理消息,并得到处理结果;

2)第53~55行:调用response.getWriter().write()方法将消息的处理结果(XML)返回给用户

 

 CrazyService.processRequest 类如下

 1 public static String processRequest(HttpServletRequest request) {
 2         String respMessage = null;
 3         try {
 4             // 默认返回的文本消息内容
 5             String respContent = "请求处理异常,请稍候尝试!";
 6 
 7             // xml请求解析
 8             Map<String, String> requestMap = MessageUtil.parseXml(request);
 9 
10             // 发送方帐号(open_id)
11             String fromUserName = requestMap.get("FromUserName");
12             // 公众帐号
13             String toUserName = requestMap.get("ToUserName");
14             // 消息类型
15             String msgType = requestMap.get("MsgType");
16 
17             // 回复文本消息
18             TextMessage textMessage = new TextMessage();
19             textMessage.setToUserName(fromUserName);
20             textMessage.setFromUserName(toUserName);
21             textMessage.setCreateTime(new Date().getTime());
22             textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
23             textMessage.setFuncFlag(0);
24 
25             // 文本消息
26             if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
27                 respContent = "您发送的是文本消息!";
28             }
29             // 图片消息
30             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
31                 respContent = "您发送的是图片消息!";
32             }
33             // 地理位置消息
34             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
35                 respContent = "您发送的是地理位置消息!";
36             }
37             // 链接消息
38             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
39                 respContent = "您发送的是链接消息!";
40             }
41             // 音频消息
42             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
43                 respContent = "您发送的是音频消息!";
44             }
45             // 事件推送
46             else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
47                 // 事件类型
48                 String eventType = requestMap.get("Event");
49                 // 订阅
50                 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
51                     respContent = "感谢您的关注!";
52                 }
53                 // 取消订阅
54                 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
55                     // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
56                 }
57                 // 自定义菜单点击事件
58                 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
59                     // TODO 自定义菜单权没有开放,暂不处理该类消息
60                 }
61             }
62 
63             textMessage.setContent(respContent);
64             respMessage = MessageUtil.textMessageToXml(textMessage);
65         } catch (Exception e) {
66             e.printStackTrace();
67         }
68 
69         return respMessage;
70     }

 

我的微信公众账号 人脸识别、音乐点播、在线翻译、天气查询、公交查询、周公解梦、星座运势、手机归属地查询、聊天唠嗑等

 

 

欢迎加入群:347245650   345531810 进行讨论相互交流  我的微信号:572839485

我的微信公众账号  我的微社区欢迎关注

博客中所有关于微信源码下载地址  http://download.csdn.net/detail/zyw_java/8633415

 

 

posted @ 2014-03-27 23:12  酷玩时刻  阅读(8089)  评论(0编辑  收藏  举报
友情链接:快递查询 快递查询