玩玩微信公众号Java版之二:接收、处理及返回微信消息

cooldamon 2021-09-02 原文


玩玩微信公众号Java版之二:接收、处理及返回微信消息


前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~
 
可以用我们的微信号来直接进行测试,下面先看测试效果图:
 

 

这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!
 
首先可以参考微信消息相关的接口文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
 
具体实现如下:
第一步,接收微信发送的文本消息入口:
 

 1 /**
 2      * 处理微信服务器发来的消息
 3      */
 4     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 5     {
 6         // TODO 消息的接收、处理、响应
 7         System.out.println("接口调用了一次");
 8 
 9         String ret = IOUtils.toString(request.getInputStream(), "utf-8").toString();
10         System.out.println(ret);
11 
12         WeChatMsgBL tWeChatMsgBL = new WeChatMsgBL();
13         String result = tWeChatMsgBL.dealWechatMsg(ret);
14 
15         response.setCharacterEncoding("UTF-8");
16 
17         // 返回文本消息,将处理结果返回
18         PrintWriter out = response.getWriter();
19 
20         System.out.println(result);
21 
22         out.print(result);
23 
24         out.close();
25 
26     }

View Code

可以先输出接收到的xml信息:

 

第二步,解析及处理接收到数据的内容:

从微信提供的接口文档上,我们可以发现,不论是文本消息还是语音、图片等消息,在xml报文中,有部分节点信息的一致的,因此可以创建一个父类在处理(变量名要与xml中节点名一致,大小写也一样,这样后面返回消息结果时很方便):

 1 /**
 2  * 微信消息主要类
 3  * @author user
 4  */
 5 public class WechatMsg
 6 {
 7     // 开发者微信号
 8     private String ToUserName = "";
 9 
10     // 发送方帐号(一个OpenID)
11     private String FromUserName = "";
12 
13     // 消息创建时间 (整型)
14     private String CreateTime = "";
15 
16     // 消息类型
17     private String MsgType = "";
18 
19     // 消息id,64位整型
20     private String MsgId = "";
21 
22     public String getToUserName()
23     {
24         return ToUserName;
25     }
26 
27     public void setToUserName(String toUserName)
28     {
29         ToUserName = toUserName;
30     }
31 
32     public String getFromUserName()
33     {
34         return FromUserName;
35     }
36 
37     public void setFromUserName(String fromUserName)
38     {
39         FromUserName = fromUserName;
40     }
41 
42     public String getCreateTime()
43     {
44         return CreateTime;
45     }
46 
47     public void setCreateTime(String createTime)
48     {
49         CreateTime = createTime;
50     }
51 
52     public String getMsgType()
53     {
54         return MsgType;
55     }
56 
57     public void setMsgType(String msgType)
58     {
59         MsgType = msgType;
60     }
61 
62     public String getMsgId()
63     {
64         return MsgId;
65     }
66 
67     public void setMsgId(String msgId)
68     {
69         MsgId = msgId;
70     }
71 
72 
73 
74 }

View Code

然后对应的基本信息子类为(只用多一个变量):

 1 /**
 2  * 普通消息类
 3  * @author Damon
 4  */
 5 public class WechatTextMsg extends WechatMsg
 6 {
 7 
 8     // 文本内容
 9     private String Content = "";
10 
11     public String getContent()
12     {
13         return Content;
14     }
15 
16     public void setContent(String content)
17     {
18         this.Content = content;
19     }
20 }

View Code

 

下面来看具体的处理,涉及新增jar包:dom4j-1.6.1.jar  

 1     /**
 2      * 处理微信信息
 3      * @param reqInfo xml信息数据
 4      * @return 处理结果
 5      */
 6     public String dealWechatMsg(String reqInfo)
 7     {
 8 
 9         String ret = reqInfo;
10 
11         String result = "";
12 
13         WechatTextMsg tReturnMsg = new WechatTextMsg();
14 
15         try
16         {
17             Document returndoc = DocumentHelper.parseText(ret);
18 
19             Element rootElement = returndoc.getRootElement();
20 
21             String tMsgType = rootElement.elementText("MsgType");
22 
23             // 根据MsgType 返回具体的消息类
24 
25             if (SysCon.TEXT_MSG_TYPE.equals(tMsgType))
26             {
27                 result = dealTextMsg(rootElement);
28             }
29 
30             // 封装返回信息
31             tReturnMsg.setCreateTime(new Date().getTime() + "");
32             tReturnMsg.setToUserName(rootElement.elementText("FromUserName"));
33             tReturnMsg.setFromUserName(rootElement.elementText("ToUserName"));
34             tReturnMsg.setContent(result);
35             tReturnMsg.setMsgType(SysCon.TEXT_MSG_TYPE);
36             // 将返回结果封装成文本消息
37             result = WeChatUtil.textToXML(tReturnMsg);
38         }
39         catch (DocumentException e)
40         {
41             // TODO Auto-generated catch block
42             e.printStackTrace();
43         }
44 
45         return result;
46     }
47 
48     /**
49      * 处理文本消息
50      * @param msg
51      * @return
52      */
53     private String dealTextMsg(Element rootElement)
54     {
55 
56         WechatTextMsg tWechatTextMsg = new WechatTextMsg();
57         // 依次赋值
58         tWechatTextMsg.setCreateTime(rootElement.elementText("CreateTime"));
59         tWechatTextMsg.setFromUserName(rootElement.elementText("FromUserName"));
60         tWechatTextMsg.setToUserName(rootElement.elementText("ToUserName"));
61         tWechatTextMsg.setMsgType(rootElement.elementText("MsgType"));
62         tWechatTextMsg.setMsgId(rootElement.elementText("MsgId"));
63         tWechatTextMsg.setContent(rootElement.elementText("Content"));
64 
65         System.out.println("传入的消息是:" + tWechatTextMsg.getContent());
66 
67         // 后续可处理保存到数据库及数据分析等,现在直接返回结果
68 
69         // 将数据转存至数据库
70         // Connection conn = DBConnPool.getConnection();
71 
72         return "传入的文本消息处理完毕";
73     }

View Code

其中对于参数类型判断,可以在SysCon类中添加基本参数
 

1     // 定义微信消息类型--文本
2     public static final String TEXT_MSG_TYPE = "text";

View Code

 

第三步,处理消息的返回
消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果
这里用到了工具类中 的方法如下:

 1     /**
 2      * 将对象转为XML输出
 3      * @param textMsg
 4      * @return
 5      */
 6     public static String textToXML(WechatTextMsg textMsg)
 7     {
 8         xstream.alias("xml", textMsg.getClass());
 9         return xstream.toXML(textMsg);
10 
11     }
12 
13     
14     /**
15      * 扩展xstream使其支持CDATA
16      */
17     private static XStream xstream = new XStream(new XppDriver()
18     {
19         public HierarchicalStreamWriter createWriter(Writer out)
20         {
21             return new PrettyPrintWriter(out)
22             {
23                 // 对所有xml节点的转换都增加CDATA标记
24                 boolean cdata = true;
25 
26                 @SuppressWarnings("unchecked")
27                 public void startNode(String name, Class clazz)
28                 {
29                     super.startNode(name, clazz);
30                 }
31 
32                 protected void writeText(QuickWriter writer, String text)
33                 {
34                     if (cdata)
35                     {
36                         writer.write("<![CDATA[");
37                         writer.write(text);
38                         writer.write("]]>");
39                     }
40                     else
41                     {
42                         writer.write(text);
43                     }
44                 }
45             };
46         }
47     });

View Code

涉及到新增jar包:xstream-1.3.1.jar
可以在最后返回前输出处理的结果:

微信上可接收到消息:传入的文本消息处理完毕。
 
 到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~
posted on
2017-07-19 23:06 
cooldamon 
阅读(2948
评论(0
编辑 
收藏 
举报

 

版权声明:本文为cooldamon原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cooldamon/p/7208622.html

玩玩微信公众号Java版之二:接收、处理及返回微信消息的更多相关文章

随机推荐

  1. iOS获取手机IP地址

          #import <ifaddrs.h>   #include <arpa/ine […]...

  2. 在Xshell 运行angular 项目时,找不到node-sass模块,安装node-sass模块时,又出现权限问题

    情景再现: 运行时的报错找不到node-sass模块    接着安装node-sass模块出现权限问题     […]...

  3. centos 6.5 查看、开启,关闭 端口

      查看所有端口   netstat -ntlp   1、开启端口(以80端口为例)         方法一: […]...

  4. Druid数据库连接池就这么简单

    前言 本章节主要讲解Druid数据库连接池,为什么要学Druid数据库连接池呢?? 我的知识储备数据库连接池有 […]...

  5. Unity使用C++作为游戏逻辑脚本的研究(二)

    文章申明:本文来自JacksonDunstan的博客系列文章内容摘取和翻译,版权归其所有,附上原文的链接,大家 […]...

  6. 在centos7 上部署 vuepress

    vuepress是一款十分优秀简洁的文档生成器,可以根据目录下的md文档自动生成对应的html文件,界面简洁大 […]...

  7. 从新建文件夹开始构建ShadowPlay Engine(5)

    本篇序言 从本篇开始,我们要开始构建引擎核心中的系统组件部分,广义上讲其实我们从开始到现在一直都是在构建引擎核 […]...

  8. ExtJS 实现的Web文件管理系统(1)

    上次的文章发了就等到了一个面试机会,还没成就来北京了上了一个.net培训班。这个是这里老师安排的作业,让用.n […]...

展开目录

目录导航