一、之前实现了关注后的消息回复,现在实现按照关键字回复
二、查看消息类型
三、关注微信号的时候,会出发关注事件
四、修改代码
1、书写一些常量(修改MessageUtils )
1 public class MessageUtils { 2 3 // 书写一些常量(会经常用到) 4 // 文本消息 5 public static final String MESSAGE_TEXT = "text"; 6 // 图片消息 7 public static final String MESSAGE_IMAGE = "image"; 8 // 语音消息 9 public static final String MESSAGE_VOICE = "voice"; 10 // 视频消息 11 public static final String MESSAGE_VIDEO = "video"; 12 // 链接消息 13 public static final String MESSAGE_LINK = "link"; 14 // 地理位置消息 15 public static final String MESSAGE_LOCATION = "location"; 16 // 事件推送 17 public static final String MESSAGE_EVENT = "event"; 18 // 关注 19 public static final String MESSAGE_SUBSCRIBE = "subscribe"; 20 // 取消关注 21 public static final String MESSAGE_UNSUBSCRIBE = "unsubscribe"; 22 // 菜单点击 23 public static final String MESSAGE_CLICK = "click"; 24 // 菜单查看 25 public static final String MESSAGE_VIEW = "view";
2、text换为MessageUtils.MESSAGE_TEXT常量(修改WeXinServlet)
1 if (MessageUtils.MESSAGE_TEXT.equals(msgType)) { 2 3 //原来的消息代码 4 5 }// 事件推送的逻辑处理 6 else if (MessageUtils.MESSAGE_EVENT.equals(msgType)) { 7 8 // 获取事件 9 String eventType = map.get("event"); 10 // 关注后的逻辑处理 11 if (MessageUtils.MESSAGE_SUBSCRIBE.equals(eventType)) { 12 13 14 } 15 }
3、修改MessageUtils,添加方法
1 /** 2 * // 1.拼接一个主菜单(这个是消息菜单,在关注微信公众号后,自动回复一个消息) 3 */ 4 public static String menuText() { 5 StringBuffer stringBuffer = new StringBuffer(); 6 stringBuffer.append("欢迎您的关注,请按照菜单提示进行操作: "); 7 stringBuffer.append("1、公司介绍 "); 8 stringBuffer.append("2、主营产品介绍 "); 9 stringBuffer.append("**回复?调出此菜单。**"); 10 return stringBuffer.toString(); 11 }
4、添加另一个方法
1 /** 2 * 2.拼接文本消息的 3 */ 4 public static String initText(String toUserName, String fromUserName, 5 String content) { 6 TextMessage textMessage = new TextMessage(); 7 textMessage.setFromUserName(toUserName); 8 textMessage.setToUserName(fromUserName); 9 // 换成常量 10 textMessage.setMsgType(MessageUtils.MESSAGE_TEXT); 11 textMessage.setCreateTime(new Date().getTime()); 12 textMessage.setContent("您发送的消息是 :" + content); 13 return textMessageToXml(textMessage); 14 }
5、添加到WeXinServlet
1 // 关注后的逻辑处理 2 if (MessageUtils.MESSAGE_SUBSCRIBE.equals(eventType)) { 3 //消息的位置 4 message = MessageUtils.initText(toUserName, fromUserName, 5 MessageUtils.menuText()); 6 }
6、判断消息回复(规则设置,红色为添加部分)
1 // 如果是文本消息,就进行回复 2 if (MessageUtils.MESSAGE_TEXT.equals(msgType)) { 3 4 // 判断消息回复(规则设置) 5 if ("1".equals(content)) { 6 message = MessageUtil.initText(toUserName, fromUserName, 7 MessageUtil.firstMenu()); 8 } else if ("2".equals(content)) { 9 message = MessageUtil.initNewsMessage(toUserName, 10 fromUserName); 11 } else if (("?".equals(content)) || ("?".equals(content))) { 12 message = MessageUtils.initText(toUserName, fromUserName, 13 MessageUtils.menuText()); 14 } 15 16 }
7、添加规则回复(MessageUtils中增加)
1 /** 2 * 添加新的规则,当输入1的时候返回的数据 3 */ 4 5 public static String firstMenu() { 6 StringBuffer stringBuffer = new StringBuffer(); 7 stringBuffer 8 .append("总部杭州。 "); 9 return stringBuffer.toString(); 10 } 11 12 /** 13 * 添加新的规则,当输入2的时候返回的数据 14 * 15 * @return 16 */ 17 public static String secondMenu() { 18 StringBuffer stringBuffer = new StringBuffer(); 19 stringBuffer 20 .append("公司主要产品为技术开发、技术服务等。 "); 21 return stringBuffer.toString(); 22 }
8、WeXinServlet中判断
1 // 如果是文本消息,就进行回复 2 if (MessageUtils.MESSAGE_TEXT.equals(msgType)) { 3 4 // 判断消息回复(规则设置) 5 if ("1".equals(content)) { 6 message = MessageUtils.initText(toUserName, fromUserName, 7 MessageUtils.firstMenu()); 8 } else if ("2".equals(content)) { 9 message = MessageUtils.initText(toUserName, fromUserName, 10 MessageUtils.secondMenu()); 11 } else if (("?".equals(content)) || ("?".equals(content))) { 12 message = MessageUtils.initText(toUserName, fromUserName, 13 MessageUtils.menuText()); 14 } 15 16 } 17 // 事件推送的逻辑处理 18 else if (MessageUtils.MESSAGE_EVENT.equals(msgType)) { 19 20 }
9、重新启动Tomcat
10、公众号测试
(1)规则验证
(2)取消关注,验证关注后消息自动回复
11、完全版WeXinServlet
1 package com.my.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Date; 6 import java.util.Map; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 import com.my.pojo.TextMessage; 14 import com.my.utils.CheckUtil; 15 import com.my.utils.MessageUtils; 16 17 /** 18 * 19 * @author liuya 20 * 21 * 22 * //微信连接 23 * 24 * 微信消息的接收与发送 25 * 26 */ 27 28 public class WeXinServlet extends HttpServlet { 29 30 /** 31 * 随机生成的版本id 32 */ 33 private static final long serialVersionUID = 1L; 34 35 /** 36 * 开发文档第一部分与微信的连接方式代码 37 */ 38 @Override 39 protected void doGet(HttpServletRequest request, 40 HttpServletResponse response) throws ServletException, IOException { 41 42 System.out.println("request.getRequestURL()返回的结果:" 43 + request.getRequestURL()); 44 45 // 跟微信平台比较的参数 46 String signature = request.getParameter("signature"); 47 String timestamp = request.getParameter("timestamp"); 48 String nonce = request.getParameter("nonce"); 49 String echostr = request.getParameter("echostr"); 50 51 PrintWriter pWriter = response.getWriter(); 52 // 微信get后进行比较 53 if (CheckUtil.checkSignature(signature, timestamp, nonce)) { 54 pWriter.print(echostr); 55 } 56 57 } 58 59 /** 60 * // 1、将XML转换成集合类型 (因为微信后台发过来的消息是一个XML类型,为了方便处理,需要把微信发来的消息,转化成集合类型) 61 * 62 * 63 * // 2、对象类型转化成XML类型(因为我们这边发送消息,也需要把数据转化成XML类型给微信服务后台接收) 64 * 65 * 66 * // 3、书写一个公共类型的类,进行消息类型的转换 67 * 68 * 文本消息类型的接收与响应 69 * 70 */ 71 72 @Override 73 protected void doPost(HttpServletRequest requset, 74 HttpServletResponse response) throws ServletException, IOException { 75 76 // 设置消息发来的格式 77 requset.setCharacterEncoding("UTF-8"); 78 // 设置接收的消息格式 79 response.setCharacterEncoding("UTF-8"); 80 81 // 通过此方法进行消息返回 82 PrintWriter outPrintWriter = response.getWriter(); 83 84 // 1.微信消息的接收 集合获取 85 Map<String, String> map; 86 try { 87 map = MessageUtils.xmlToMap(requset); 88 89 // 2.获取集合中的属性 90 // 开发者微信号 91 String toUserName = (String) map.get("ToUserName"); 92 // 发送方账号(一个OpenID) 93 String fromUserName = (String) map.get("FromUserName"); 94 // 消息类型 95 String msgType = (String) map.get("MsgType"); 96 // 文本消息内容 97 String content = (String) map.get("Content"); 98 99 // 3.根据messageType判断消息是不是文本消息 100 // 设置消息回复变量 101 String message = null; 102 103 // 如果是文本消息,就进行回复 104 if (MessageUtils.MESSAGE_TEXT.equals(msgType)) { 105 106 // 判断消息回复(规则设置) 107 if ("1".equals(content)) { 108 message = MessageUtils.initText(toUserName, fromUserName, 109 MessageUtils.firstMenu()); 110 } else if ("2".equals(content)) { 111 message = MessageUtils.initText(toUserName, fromUserName, 112 MessageUtils.secondMenu()); 113 } else if (("?".equals(content)) || ("?".equals(content))) { 114 message = MessageUtils.initText(toUserName, fromUserName, 115 MessageUtils.menuText()); 116 } 117 118 } 119 // 事件推送的逻辑处理 120 else if (MessageUtils.MESSAGE_EVENT.equals(msgType)) { 121 122 // 获取事件 123 String eventType = map.get("event"); 124 // 关注后的逻辑处理 125 if (MessageUtils.MESSAGE_SUBSCRIBE.equals(eventType)) { 126 // 消息的位置 127 message = MessageUtils.initText(toUserName, fromUserName, 128 MessageUtils.menuText()); 129 } 130 } 131 132 // 打印消息到控制台 133 System.out.print(message); 134 135 // 消息返回 136 outPrintWriter.print(message); 137 138 } catch (Exception e) { 139 e.printStackTrace(); 140 } finally { 141 // 关闭流 142 outPrintWriter.close(); 143 } 144 145 } 146 147 }
12、完全版MessageUtils
1 package com.my.utils; 2 3 import java.io.InputStream; 4 import java.util.Date; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.servlet.http.HttpServletRequest; 10 11 import org.dom4j.Document; 12 import org.dom4j.Element; 13 import org.dom4j.io.SAXReader; 14 15 import com.my.pojo.TextMessage; 16 import com.thoughtworks.xstream.XStream; 17 18 /** 19 * 20 * // @author liuya 21 * 22 * // 后端接收,微信公众号发过来的消息功能 23 * 24 * 25 * // 1、将XML转换成集合类型 (因为微信后台发过来的消息是一个XML类型,为了方便处理,需要把微信发来的消息,转化成集合类型) 26 * 27 * // 2、对象类型转化成XML类型(因为我们这边发送消息,也需要把数据转化成XML类型给微信服务后台接收) 28 */ 29 30 public class MessageUtils { 31 32 // 书写一些常量(会经常用到) 33 // 文本消息 34 public static final String MESSAGE_TEXT = "text"; 35 // 图片消息 36 public static final String MESSAGE_IMAGE = "image"; 37 // 语音消息 38 public static final String MESSAGE_VOICE = "voice"; 39 // 视频消息 40 public static final String MESSAGE_VIDEO = "video"; 41 // 链接消息 42 public static final String MESSAGE_LINK = "link"; 43 // 地理位置消息 44 public static final String MESSAGE_LOCATION = "location"; 45 // 事件推送 46 public static final String MESSAGE_EVENT = "event"; 47 // 关注 48 public static final String MESSAGE_SUBSCRIBE = "subscribe"; 49 // 取消关注 50 public static final String MESSAGE_UNSUBSCRIBE = "unsubscribe"; 51 // 菜单点击 52 public static final String MESSAGE_CLICK = "click"; 53 // 菜单查看 54 public static final String MESSAGE_VIEW = "view"; 55 56 /** 57 * 需要导入dom4j---jar包 // 58 * 59 * //1、将XML转换成集合类型 (因为微信后台发过来的消息是一个XML类型,为了方便处理,需要把微信发来的消息,转化成集合类型)// 60 * 61 * @param request 62 * @return 63 * @throws Exception 64 */ 65 @SuppressWarnings("unchecked") 66 public static Map<String, String> xmlToMap(HttpServletRequest request) 67 throws Exception { 68 69 Map<String, String> map = new HashMap<String, String>(); 70 SAXReader sReader = new SAXReader(); 71 72 // 从request中获取输入流 73 InputStream inStream = request.getInputStream(); 74 Document document = sReader.read(inStream); 75 76 // 获取xml中的根元素 77 Element rootElement = document.getRootElement(); 78 79 // 得到根元素的所有子节点,把它放在list的集合中 80 List<Element> list = rootElement.elements(); 81 82 // 遍历list对象,获取单个元素的数据 83 for (Element element : list) { 84 85 // 遍历的结果保存到集合中 86 map.put(element.getName(), element.getText()); 87 } 88 89 // 关闭流 90 inStream.close(); 91 92 return map; 93 } 94 95 /** 96 * 导入xsream---jar包 97 * 98 * // 2、对象类型转化成XML类型(因为我们这边发送消息,也需要把数据转化成XML类型给微信服务后台接收) 99 * 100 * // 3、创建文本消息需要的实体类 101 * 102 * @param textMessage 103 * @return 104 */ 105 public static String textMessageToXml(TextMessage textMessage) { 106 XStream xstream = new XStream(); 107 108 // 打印出根节点的<xml> 109 xstream.alias("xml", textMessage.getClass()); 110 // 返回发来的消息到控制台 111 return xstream.toXML(textMessage); 112 } 113 114 /** 115 * // 1.拼接一个主菜单(这个是消息菜单,在关注微信公众号后,自动回复一个消息) 116 */ 117 public static String menuText() { 118 StringBuffer stringBuffer = new StringBuffer(); 119 stringBuffer.append("欢迎您的关注,请按照菜单提示进行操作: "); 120 stringBuffer.append("1、公司介绍 "); 121 stringBuffer.append("2、主营产品介绍 "); 122 stringBuffer.append("**回复?调出此菜单。**"); 123 return stringBuffer.toString(); 124 } 125 126 /** 127 * 2.拼接文本消息的 128 */ 129 public static String initText(String toUserName, String fromUserName, 130 String content) { 131 TextMessage textMessage = new TextMessage(); 132 textMessage.setFromUserName(toUserName); 133 textMessage.setToUserName(fromUserName); 134 // 换成常量 135 textMessage.setMsgType(MessageUtils.MESSAGE_TEXT); 136 textMessage.setCreateTime(new Date().getTime()); 137 textMessage.setContent("您发送的消息是 :" + content); 138 return textMessageToXml(textMessage); 139 } 140 141 /** 142 * 添加新的规则,当输入1的时候返回的数据 143 */ 144 145 public static String firstMenu() { 146 StringBuffer stringBuffer = new StringBuffer(); 147 stringBuffer 148 .append("总部杭州。 ");
149 return stringBuffer.toString();
150 }
151
152 /**
153 * 添加新的规则,当输入2的时候返回的数据
154 *
155 * @return
156 */
157 public static String secondMenu() {
158 StringBuffer stringBuffer = new StringBuffer();
159 stringBuffer
160 .append("总部杭州。 ");
161 return stringBuffer.toString();
162 }
163 }