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