玩玩微信公众号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     }

可以先输出接收到的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 }

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

 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 }

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

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

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

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

第三步,处理消息的返回

消息处理完成后,返回文本(可返回不同类型,仅以文本为例)处理结果

这里用到了工具类中 的方法如下:

 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     });

涉及到新增jar包:xstream-1.3.1.jar

可以在最后返回前输出处理的结果:

微信上可接收到消息:传入的文本消息处理完毕。

到这,本节内容就结束了,可以自己去扩展语音消息的接收和处理哦~

时间: 2024-10-05 18:58:17

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

玩玩微信公众号Java版之一:配置微信公众平台服务器信息

在进行微信公众平台开发前,前先做好准备工作,好了以后,我们可以开始啦! 第一.准备好服务端接口 定义一个http服务接口,主要分为如下几步: 1.创建一个servlet类,用来接收请求: 1 package com.wechat; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.H

玩玩微信公众号Java版之四:自定义公众号菜单

序: 微信公众号基本的菜单很难满足个性化及多功能的实现,那么微信能否实现自定菜单呢,具体的功能又如何去实现么?下面就来学习一下微信自定义公众号菜单吧! 自定义菜单接口可实现多种类型按钮,如下: 1.click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互:2.view:跳转URL用户点击view类型按钮后,微信客户端将会打开开发者在按钮中

玩玩微信公众号Java版之六:微信网页授权

我们经常会访问一些网站,用微信登录的时候需要用到授权,那么微信网页授权是怎么一回事呢,一起来看看吧! 参考官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 官方的文档有很详细的说明,这里就主要分析重要的几点: 第一,网页授权分类及说明: 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回调页(往往

玩玩微信公众号Java版之三:access_token及存储access_token

微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 基本说明: access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保留512个字符空间.access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效. 调用方式: 公众号可以使用App

C#微信公众号开发系列教程(接收事件推送与消息排重)

微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂.如送积分啊,写用户日志啊,分配用户组啊.等等……一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完成,微信服务器又给我们的服务器推送了一条相同的关注事件,我们将再次执行我们的那些逻辑,这样就有可能导致

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微

微信公众号扫描带参数二维码实现自动分组?

最近很多人都在问微信公众号扫描带参数二维码实现自动分组,通过微号帮平台操作实现,这个功能不止如此,微信二维码来源统计分析.微信带参数二维码统计分析.微信渠道二维码统计分析.自动生成微信二维码统计分析.微信海报二维码统计分析管理平台(地推派传单提供有效渠道分析).解决了微信公众号地推派单推广渠道跟踪的问题,可以实时进行监控派单推广渠道的扫码微信的关注,取消,新增,净增等相关数据,实时进行数据分析,为推广方向提供有了强有力的帮助和分析,同时对派单人员进行有效的考核,比如每个派单人员现场扫码的关注用户

微信公众号平台接口开发:基础支持,获取微信服务器IP地址

官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 1 public static string ServerIPs 2 { 3 get { return GetServerIPs(); } 4 } 5 6 /// <summary>获取所有服务器IP</summary> 7 /// <returns></returns> 8 private static str

PHP开发微信公众号(一)二维码的获取

要开发微信公众号,首先进行需要注册一个,然后认证.这就不用多说了. 当然如果没有,也可以去申请一个测试号来使用,地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 申请成功后,你会得到一个appID 和 appsecret,这个就相当于你的开发者账号和密码. 开发模式如下图: 1.Access_Token的获取 对于这个access_token就是一个访问标识,其实不用想得太高深,它就好比是你进图书馆需要的图书卡: