欢迎加入群: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 [email protected] 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