一、书写一个公共类型的类,进行消息类型的转换
1 package com.my.utils; 2 3 import java.io.InputStream; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.servlet.http.HttpServletRequest; 9 10 import org.dom4j.Document; 11 import org.dom4j.Element; 12 import org.dom4j.io.SAXReader; 13 14 import com.my.pojo.TextMessage; 15 import com.thoughtworks.xstream.XStream; 16 17 /** 18 * 19 * // @author liuya 20 * 21 * // 后端接收,微信公众号发过来的消息功能 22 * 23 * 24 * // 1、将XML转换成集合类型 (因为微信后台发过来的消息是一个XML类型,为了方便处理,需要把微信发来的消息,转化成集合类型) 25 * 26 * // 2、对象类型转化成XML类型(因为我们这边发送消息,也需要把数据转化成XML类型给微信服务后台接收) 27 */ 28 29 public class MessageUtils { 30 31 /** 32 * 需要导入dom4j---jar包 // 33 * 34 * //1、将XML转换成集合类型 (因为微信后台发过来的消息是一个XML类型,为了方便处理,需要把微信发来的消息,转化成集合类型)// 35 * 36 * @param request 37 * @return 38 * @throws Exception 39 */ 40 @SuppressWarnings("unchecked") 41 public static Map<String, String> xmlToMap(HttpServletRequest request) 42 throws Exception { 43 44 Map<String, String> map = new HashMap<String, String>(); 45 SAXReader sReader = new SAXReader(); 46 47 // 从request中获取输入流 48 InputStream inStream = request.getInputStream(); 49 Document document = sReader.read(inStream); 50 51 // 获取xml中的根元素 52 Element rootElement = document.getRootElement(); 53 54 // 得到根元素的所有子节点,把它放在list的集合中 55 List<Element> list = rootElement.elements(); 56 57 // 遍历list对象,获取单个元素的数据 58 for (Element element : list) { 59 60 // 遍历的结果保存到集合中 61 map.put(element.getName(), element.getText()); 62 } 63 64 // 关闭流 65 inStream.close(); 66 67 return map; 68 } 69 70 /** 71 * 导入xsream---jar包 72 * 73 * // 2、对象类型转化成XML类型(因为我们这边发送消息,也需要把数据转化成XML类型给微信服务后台接收) 74 * 75 * // 3、创建文本消息需要的实体类 76 * 77 * @param textMessage 78 * @return 79 */ 80 public static String textMessageToXml(TextMessage textMessage) { 81 XStream xstream = new XStream(); 82 83 // 打印出根节点的<xml> 84 xstream.alias("xml", textMessage.getClass()); 85 // 返回发来的消息到控制台 86 return xstream.toXML(textMessage); 87 } 88 89 }
二、书写消息属性的pojo类,属性是微信开发文档上的参数
1 package com.my.pojo; 2 3 /** 4 * 5 * @author liuya 6 * 7 * 8 * // 文本消息使用的实体类 9 */ 10 11 public class TextMessage { 12 13 // 需要的属性,通过开发文档得到6个属性 14 15 // 开发者微信号 16 private String FromUserName; 17 // 发送方账号(一个OpenID) 18 private String ToUserName; 19 // 消息创建时间(整型) 20 private long CreateTime; 21 // text 22 private String MsgType; 23 // 文本消息内容 24 private String Content; 25 // 消息id,64位整数 26 private String MsgId; 27 28 public TextMessage() { 29 } 30 31 public TextMessage(String fromUserName, String toUserName, long createTime, 32 String msgType, String content, String msgId) { 33 FromUserName = fromUserName; 34 ToUserName = toUserName; 35 CreateTime = createTime; 36 MsgType = msgType; 37 Content = content; 38 MsgId = msgId; 39 } 40 41 public String getFromUserName() { 42 return FromUserName; 43 } 44 45 public void setFromUserName(String fromUserName) { 46 FromUserName = fromUserName; 47 } 48 49 public String getToUserName() { 50 return ToUserName; 51 } 52 53 public void setToUserName(String toUserName) { 54 ToUserName = toUserName; 55 } 56 57 public long getCreateTime() { 58 return CreateTime; 59 } 60 61 public void setCreateTime(long createTime) { 62 CreateTime = createTime; 63 } 64 65 public String getMsgType() { 66 return MsgType; 67 } 68 69 public void setMsgType(String msgType) { 70 MsgType = msgType; 71 } 72 73 public String getContent() { 74 return Content; 75 } 76 77 public void setContent(String content) { 78 Content = content; 79 } 80 81 public String getMsgId() { 82 return MsgId; 83 } 84 85 public void setMsgId(String msgId) { 86 MsgId = msgId; 87 } 88 89 @Override 90 public String toString() { 91 return "TextMessage [FromUserName=" + FromUserName + ", ToUserName=" 92 + ToUserName + ", CreateTime=" + CreateTime + ", MsgType=" 93 + MsgType + ", Content=" + Content + ", MsgId=" + MsgId + "]"; 94 } 95 96 }
三、文本消息类型的接收与响应(红色部分)
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 43 System.out.println("request.getRequestURL()返回的结果:"+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 ("text".equals(msgType)) { 105 106 // 创建消息对象 107 TextMessage text = new TextMessage(); 108 109 // 开发者微信号 110 text.setFromUserName(toUserName); 111 112 // 发送方账号(一个OpenID) 113 text.setFromUserName(fromUserName); 114 115 // 消息类型 116 text.setMsgType("text"); 117 118 // 消息创建时间,当前时间 119 text.setCreateTime(new Date().getTime()); 120 121 // 文本消息内容(当微信输入消息的时候,返回给它,它输入的消息) 122 text.setContent("客户发来的消息是 :***************" + content 123 + " *******************"); 124 125 // 消息类型转化为微信可识别的xml类型 126 message = MessageUtils.textMessageToXml(text);
// 打印消息到控制台
System.out.print(message);
127
128 }
129
130 // 消息返回
131 outPrintWriter.print(message);
132
133 } catch (Exception e) {
134 e.printStackTrace();
135 } finally {
136 // 关闭流
137 outPrintWriter.close();
138 }
139
140 }
141
142 }
四、设置内网穿透工具
五、启动Tomcat
六、微信公众号上输入内容、查看控制台和微信上的结果