需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar
第一步:新建包com.wtz.message.response,新建类BaseMessage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午3:12:40 * <p>version:1.0</p> * <p>description:基础消息类</p> */ public class BaseMessage { //接收方 private String ToUserName; //发送方 private String FromUserName; //消息的创建时间 private long CreateTime; //消息类型 private String MsgType; public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public long getCreateTime() { return CreateTime; } public void setCreateTime( long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } } |
第二步:找到包com.wtz.message.response,新建类TextMessage.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package com.wtz.message.response; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午3:22:33 * <p>version:1.0</p> * <p>description:文本消息类</p> */ public class TextMessage extends BaseMessage{ //消息内容 private String Content; public String getContent() { return Content; } public void setContent(String content) { Content = content; } } |
第三步:找到包com.wtz.util,新建类MessageUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
package com.wtz.util; import java.io.IOException; import java.io.InputStream; import java.io.Writer; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.core.util.QuickWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; import com.thoughtworks.xstream.io.xml.XppDriver; import com.wtz.message.response.TextMessage; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午3:29:58 * <p>version:1.0</p> * <p>description:消息处理工具类</p> */ public class MessageUtil { //定义了消息类型(常量:文本类型) public static final String RESP_MESSAGE_TYPE_TEXT = "text" ; //从流中解析出每个节点的内容 public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{ Map<String,String> map = new HashMap<String,String>(); //从输入流中获取流对象 InputStream in = request.getInputStream(); //构建SAX阅读器对象 SAXReader reader = new SAXReader(); try { //从流中获得文档对象 Document doc = reader.read(in); //获得根节点 Element root = doc.getRootElement(); //获取根节点下的所有子节点 List<Element> children = root.elements(); for (Element e:children){ //遍历每一个节点,并按照节点名--节点值放入map中 map.put(e.getName(), e.getText()); System.out.println( "用户发送的消息XML解析为:" + e.getName() + e.getText()); } //关闭流 in.close(); in = null ; } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } return map; } /** * 用于扩展节点数据按照<ToUserName><![CDATA[toUser]]></ToUserName>,中间加了CDATA段 */ private static XStream xstream = new XStream( new XppDriver(){ public HierarchicalStreamWriter createWriter(Writer out){ return new PrettyPrintWriter(out){ boolean cdata = true ; public void startNode(String name,Class clazz){ super .startNode(name,clazz); } protected void writeText(QuickWriter writer,String text){ if (cdata){ writer.write( "<![CDATA[" ); writer.write(text); writer.write( "]]>" ); } else { writer.write(text); } } }; } }); /** * 将文本消息转换成XML格式 */ public static String messageToXml(TextMessage textMessage){ xstream.alias( "xml" ,textMessage.getClass()); String xml = xstream.toXML(textMessage); System.out.println( "响应所转换的XML:" +xml); return xml; } } |
第四步:找到包com.wtz.service,新建类ProcessService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package com.wtz.util; import java.io.IOException; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.wtz.message.response.TextMessage; /** * @author wangtianze QQ:864620012 * @date 2017年4月19日 下午8:04:14 * <p>version:1.0</p> * <p>description:核心服务类</p> */ public class ProcessService { public static String dealRequest(HttpServletRequest request) throws IOException{ //响应的XML串 String respXml = "" ; //要响应的文本内容 String respContent = "未知的消息类型" ; Map<String,String> requestMap = MessageUtil.parseXml(request); String fromUserName = requestMap.get( "FromUserName" ); String toUserName = requestMap.get( "ToUserName" ); String MsgType = requestMap.get( "MsgType" ); String Content = requestMap.get( "Content" ); System.out.println( "用户给公众号发的消息为:" + Content); //构建一条文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime( new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if (MsgType.equals(MessageUtil.RESP_MESSAGE_TYPE_TEXT)){ respContent = "王天泽的公众号收到了您的一条文本消息:" + Content + ",时间戳是:" + ( new Date().getTime()); } textMessage.setContent(respContent); respXml = MessageUtil.messageToXml(textMessage); System.out.println( "respXml:" +respXml); return respXml; } } |
第五步:找到包com.wtz.service下的LoginServlet类,重写doPost方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package com.wtz.service; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.wtz.util.MessageUtil; import com.wtz.util.ProcessService; import com.wtz.util.ValidationUtil; /** * @author wangtianze QQ:864620012 * @date 2017年4月17日 下午8:11:32 * <p>version:1.0</p> * <p>description:微信请求验证类</p> */ public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( "get请求。。。。。。" ); //1.获得微信签名的加密字符串 String signature = request.getParameter( "signature" ); //2.获得时间戳信息 String timestamp = request.getParameter( "timestamp" ); //3.获得随机数 String nonce = request.getParameter( "nonce" ); //4.获得随机字符串 String echostr = request.getParameter( "echostr" ); System.out.println( "获得微信签名的加密字符串:" +signature); System.out.println( "获得时间戳信息:" +timestamp); System.out.println( "获得随机数:" +nonce); System.out.println( "获得随机字符串:" +echostr); PrintWriter out = response.getWriter(); //验证请求确认成功原样返回echostr参数内容,则接入生效,成为开发者成功,否则失败 if (ValidationUtil.checkSignature(signature, timestamp, nonce)){ out.print(echostr); } out.close(); out = null ; } /** * 接受微信服务器发过来的XML数据包(通过post请求发送过来的) */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 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 (ValidationUtil.checkSignature(signature,timestamp,nonce)){ String respXml = "" ; try { respXml = ProcessService.dealRequest(request); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } out.print(respXml); } out.close(); out = null ; } } |
完成微信文本消息接口请求与发送。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。