博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信公众帐号开发教程第7篇-各种消息的接收与响应------- 此项目的源码在文章的末尾...
阅读量:6326 次
发布时间:2019-06-22

本文共 5218 字,大约阅读时间需要 17 分钟。

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

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

 

图床:没有服务器 拖拽图片 外网即可访问

 

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

当用户向公众帐号发消息时,微信服务器会将消息通过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 Javen17  * @Email zyw205@gmail.com18  * 19  */20 public class CrazyServlet extends HttpServlet {21 22     private static final long serialVersionUID = -5021188348833856475L;23     @Override24     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     @Override44     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
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://ecmaa.baihongyu.com/

你可能感兴趣的文章
zabbix对数据盘磁盘容量进行监控
查看>>
PHP开发api接口安全验证的实例,值得一看
查看>>
Redis-Sentinel Redis的哨兵模式
查看>>
RNN网络【转】
查看>>
Openwrt 远程调试
查看>>
keras的训练引擎:train_array.py和train_generator.py
查看>>
WebSocket
查看>>
使用CefSharp在.Net程序中嵌入Chrome浏览器(十)——独立文件夹部署
查看>>
BZOJ4598: [Sdoi2016]模式字符串(点分治 hash)
查看>>
docker中mysql数据库的数据导入和导出
查看>>
图片 base64转byte[]
查看>>
关于C#中async/await中的异常处理(下)-(转载)
查看>>
Java中使用同步关键字synchronized需要注意的问题
查看>>
(原創) 今晚重看中森明菜1988年的演唱会 (中森明菜) (日記)
查看>>
让你的Windows Mobile充当wifi路由 - WMWifiRouter
查看>>
常见证书格式和转换
查看>>
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>
神经网络和深度学习简史(一)
查看>>
世界是数字的
查看>>