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

本文档详细介绍了如何配置微信服务器并实现接收、处理和回复文本消息。首先通过`doPost`方法接收微信发送的XML消息,然后使用DOM4J解析XML,创建消息基类和子类进行数据封装。接着,根据消息类型处理不同类型的文本消息,并返回处理结果。最后,使用XStream将处理结果转换为XML并返回给微信。整个过程涉及到了微信接口文档、XML解析、消息处理和返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~

可以用我们的微信号来直接进行测试,下面先看测试效果图:

7208622.html

64b4cec521d79350958ae084a19607e2.png

这是最基本的文本消息的接收、处理及返回,来看看是怎么实现的吧!

具体实现如下:

第一步,接收微信发送的文本消息入口:

7208622.html

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**

2 * 处理微信服务器发来的消息3 */

4 public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException5 {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 = newWeChatMsgBL();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信息:

7208622.html

e8d6cbd9c90177c02f35d04942f7eb4e.png

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**

2 * 微信消息主要类3 *@authoruser4 */

5 public classWechatMsg6 {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 publicString getToUserName()23 {24 returnToUserName;25 }26

27 public voidsetToUserName(String toUserName)28 {29 ToUserName =toUserName;30 }31

32 publicString getFromUserName()33 {34 returnFromUserName;35 }36

37 public voidsetFromUserName(String fromUserName)38 {39 FromUserName =fromUserName;40 }41

42 publicString getCreateTime()43 {44 returnCreateTime;45 }46

47 public voidsetCreateTime(String createTime)48 {49 CreateTime =createTime;50 }51

52 publicString getMsgType()53 {54 returnMsgType;55 }56

57 public voidsetMsgType(String msgType)58 {59 MsgType =msgType;60 }61

62 publicString getMsgId()63 {64 returnMsgId;65 }66

67 public voidsetMsgId(String msgId)68 {69 MsgId =msgId;70 }71

72

73

74 }

View Code

7208622.html

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**

2 * 普通消息类3 *@authorDamon4 */

5 public class WechatTextMsg extendsWechatMsg6 {7

8 //文本内容

9 private String Content = "";10

11 publicString getContent()12 {13 returnContent;14 }15

16 public voidsetContent(String content)17 {18 this.Content =content;19 }20 }

View Code

7208622.html

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**

2 * 处理微信信息3 *@paramreqInfo xml信息数据4 *@return处理结果5 */

6 publicString dealWechatMsg(String reqInfo)7 {8

9 String ret =reqInfo;10

11 String result = "";12

13 WechatTextMsg tReturnMsg = newWechatTextMsg();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 returnresult;46 }47

48 /**

49 * 处理文本消息50 *@parammsg51 *@return

52 */

53 privateString dealTextMsg(Element rootElement)54 {55

56 WechatTextMsg tWechatTextMsg = newWechatTextMsg();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

7208622.html

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

7208622.html

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 //定义微信消息类型--文本

2 public static final String TEXT_MSG_TYPE = "text";

View Code

第三步,处理消息的返回

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

7208622.html

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 /**

2 * 将对象转为XML输出3 *@paramtextMsg4 *@return

5 */

6 public staticString textToXML(WechatTextMsg textMsg)7 {8 xstream.alias("xml", textMsg.getClass());9 returnxstream.toXML(textMsg);10

11 }12

13

14 /**

15 * 扩展xstream使其支持CDATA16 */

17 private static XStream xstream = new XStream(newXppDriver()18 {19 publicHierarchicalStreamWriter createWriter(Writer out)20 {21 return newPrettyPrintWriter(out)22 {23 //对所有xml节点的转换都增加CDATA标记

24 boolean cdata = true;25

26 @SuppressWarnings("unchecked")27 public voidstartNode(String name, Class clazz)28 {29 super.startNode(name, clazz);30 }31

32 protected voidwriteText(QuickWriter writer, String text)33 {34 if(cdata)35 {36 writer.write("");39 }40 else

41 {42 writer.write(text);43 }44 }45 };46 }47 });

View Code

7208622.html

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

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

d88010e4a1fc0fe7659c745e252b5539.png

7208622.html

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值