java开发微信公众号(SpringMVC)2-消息管理功能
2016-11-08 18:10
423 查看
微信移动端软件,可以向公众号发送消息,如文字,语音,图片等等,在这个过程中,微信端服务器首先要接受到你发送的消息,然后根据你发送的消息会产生不同的回应。
这个回应要想自己设定内容(微信公众号管理界面可以设置简单的回复),就必须要在微信设置中打开服务器配置。
此处打开配置后需要自己的服务器地址,如下:
(此处请忽略-->此处可以给大家推荐一个服务器购买点,方便开发,https://www.fjjsp.com,相当便宜,而且有半个月试用期,有兴趣可以去了解下,小编就是在那买的。)
配置好微信的,接下来就是代码的编写了。此处不再赘述springmvc的机制。
1.首先是能接收来自微信服务器的请求,还有接受用户发送的文字,并解析文字。直接上代码(代码有参考柳峰微信)。
其中post方法中的String respXml = CoreService.processRequest(request);out.print(respXml)
这两句分别是解析request 数据,业务处理也就是返回什么数据和将数据再自动发送给用户。
因为服务器接收和返回的数据类型都是有固定格式的,一般为了方便开发,都会自己封装好实体类,然后解析好再调用。
2.解析数据
3.当这个过程了解和实现后,我们需要做的就是在业务处理类中处理接收到的消息。比如根据发送的文本内容回复,事件内容回复,比如菜单点击,这个以后会重点提及。
此处不再赘述如何解析数据格式,和封装成什么样的实体类,代码项目直接给你们,你们去参考。不用csdn分(http://download.csdn.net/detail/zjcool2012/9676715)。
此处有这些相关的问题,可以发送邮件到我的私人邮箱(2501399916@qq,com),我会一一为大家解答的。
这个回应要想自己设定内容(微信公众号管理界面可以设置简单的回复),就必须要在微信设置中打开服务器配置。
此处打开配置后需要自己的服务器地址,如下:
(此处请忽略-->此处可以给大家推荐一个服务器购买点,方便开发,https://www.fjjsp.com,相当便宜,而且有半个月试用期,有兴趣可以去了解下,小编就是在那买的。)
配置好微信的,接下来就是代码的编写了。此处不再赘述springmvc的机制。
1.首先是能接收来自微信服务器的请求,还有接受用户发送的文字,并解析文字。直接上代码(代码有参考柳峰微信)。
package com.zj.controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.liufeng.course.service.CoreService; import org.liufeng.course.util.SignUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; /** * 消息自动处理接口 * @author Administrator * */ @Controller @RequestMapping("wechat.do") public class XxtController { private String token = "abc"; @RequestMapping(method = RequestMethod.GET) @ResponseBody public void xxtInterface(HttpServletRequest request, HttpServletResponse response) throws IOException{ // 微信加密签名 String signature = request.getParameter("signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce"); // 随机字符串 String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); // 请求校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; } @RequestMapping(method = RequestMethod.POST) @ResponseBody public void getWeiXinMessage(HttpServletRequest request, HttpServletResponse response) throws Exception { // 将请求、响应的编码均设置为UTF-8(防止中文乱码) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 接收参数微信加密签名、 时间戳、随机数 String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); PrintWriter out = response.getWriter(); // 请求校验 if (SignUtil.checkSignature(signature, timestamp, nonce)) { // 调用核心服务类接收处理请求 String respXml = CoreService.processRequest(request); out.print(respXml); } out.close(); out = null; } }此处的do方法必须和服务器配置中的服务器地址最后的一样。
其中post方法中的String respXml = CoreService.processRequest(request);out.print(respXml)
这两句分别是解析request 数据,业务处理也就是返回什么数据和将数据再自动发送给用户。
因为服务器接收和返回的数据类型都是有固定格式的,一般为了方便开发,都会自己封装好实体类,然后解析好再调用。
2.解析数据
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception { // 将解析结果存储在HashMap中 Map<String, String> map = new HashMap<String, String>(); // 从request中取得输入流 InputStream inputStream = request.getInputStream(); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List<Element> elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) map.put(e.getName(), e.getText()); // 释放资源 inputStream.close(); inputStream = null; return map; }
3.当这个过程了解和实现后,我们需要做的就是在业务处理类中处理接收到的消息。比如根据发送的文本内容回复,事件内容回复,比如菜单点击,这个以后会重点提及。
package com.lianchuang.service; public class CoreService { static Logger logger = LoggerFactory.getLogger(CoreService.class); /** * 处理微信发来的请求 * * @param request * @return */ public static String processRequest(HttpServletRequest request) { String respMessage = null; try { // 默认返回的文本消息内容 String respContent = "请求处理异常,请稍候尝试!"; // xml请求解析 // 调用消息工具类MessageUtil解析微信发来的xml格式的消息,解析的结果放在HashMap里; Map<String, String> requestMap = MessageUtil.parseXml(request); // 从HashMap中取出消息中的字段; // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 消息类型 String msgType = requestMap.get("MsgType"); // 消息内容 String content = requestMap.get("Content"); // 从HashMap中取出消息中的字段; logger.info("fromUserName is:" +fromUserName+" toUserName is:" +toUserName+" msgType is:" +msgType); // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { //微信聊天机器人测试 2015-3-31 if(content!=null){ respContent = TulingApiProcess.getTulingResult(content); if(respContent==""||null==respContent){ MessageResponse.getTextMessage(fromUserName , toUserName , "服务号暂时无法回复,请稍后再试!"); } //return FormatXmlProcess.formatXmlAnswer(toUserName, fromUserName, respContent); return MessageResponse.getTextMessage(fromUserName , toUserName , respContent); } } else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {// 事件推送 String eventType = requestMap.get("Event");// 事件类型 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {// 订阅 respContent = "欢迎关注沪动校讯通!"; return MessageResponse.getTextMessage(fromUserName , toUserName , respContent); } else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {// 取消订阅 // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息 } else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {// 自定义菜单点击事件 String eventKey = requestMap.get("EventKey");// 事件KEY值,与创建自定义菜单时指定的KEY值对应 logger.info("eventKey is:" +eventKey); return MenuClickService.getClickResponse(eventKey , fromUserName , toUserName); } } //开启微信声音识别测试 2015-3-30 else if(msgType.equals("voice")) { String recvMessage = requestMap.get("Recognition"); //respContent = "收到的语音解析结果:"+recvMessage; if(recvMessage!=null){ respContent = TulingApiProcess.getTulingResult(recvMessage); }else{ respContent = "您说的太模糊了,能不能重新说下呢?"; } return MessageResponse.getTextMessage(fromUserName , toUserName , respContent); } //拍照功能 else if(msgType.equals("pic_sysphoto")) { } else { return MessageResponse.getTextMessage(fromUserName , toUserName , "返回为空"); } } catch (Exception e) { e.printStackTrace(); } return respMessage; } }
此处不再赘述如何解析数据格式,和封装成什么样的实体类,代码项目直接给你们,你们去参考。不用csdn分(http://download.csdn.net/detail/zjcool2012/9676715)。
此处有这些相关的问题,可以发送邮件到我的私人邮箱(2501399916@qq,com),我会一一为大家解答的。
相关文章推荐
- java微信公众号开发总结(2)——文本消息处理
- Java开发微信公众号接收和被动回复普通消息
- 微信公众号开发教程[009]-消息管理-模板消息
- java excel完整实现导入到数据库的功能开发试题导入功能 整合springmvc mybatis 处理
- JAVA开发微信公众号-接收和发送消息
- java springMVC 开发微信公众号
- 微信公众号开发教程[003]-消息管理-接收消息
- 微信公众号开发教程[010]-消息管理-获取公众号的自动回复规则
- 微信公众号开发教程[005]-消息管理-消息加解密
- java excel完整实现导入到数据库的功能开发试题导入功能 整合springmvc mybatis 处理
- 用java开发微信公众号:公众号接入和access_token管理(二)
- 微信开发学习总结(三)——开发微信公众号的最基本功能——普通消息的接收和回复
- java微信二次第三方开发,token认证,消息事件接收,图文素材库,自定义菜单等功能
- Java开发自己的IDE(已经有界面、编译、运行、后台工程管理功能)
- Java快速开发框架LML功能菜单管理
- 用java开发微信公众号:接收和被动回复普通消息(三)
- C#开发微信门户及应用(37)--微信公众号标签管理功能
- C#微信开发之微信公众号标签管理功能
- java开发微信公众号(SpringMVC)1-简述
- Java源码ExtJS 5 SpringMVC 4Hibernate 4通用后台管理开发框架