需要导入库: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 ;
}
}
|
完成微信文本消息接口请求与发送。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。