Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点:

1. url 仍然不变,还是开发配置里的url

2. 微信采用 xml 格式传输数据

3.微信服务器传给我们的参数主要有(如图):

附上解析xml类的依赖:

 1  <!-- dom对象读取写入xml文件 -->
 2       <dependency>
 3           <groupId>dom4j</groupId>
 4           <artifactId>dom4j</artifactId>
 5           <version>2.0.0</version>
 6       </dependency>
 7       <dependency>
 8           <groupId>com.thoughtworks.xstream</groupId>
 9           <artifactId>xstream</artifactId>
10           <version>1.4.9</version>
11       </dependency>

第一步:建立model 类接收参数(基本信息类,子类,子类包括文本信息类,图片信息类,语音信息类等,本人暂时只写了文本的信息类)

基类:

 1 package com.encore.model;
 2
 3 import lombok.*;
 4
 5 /**
 6  *  微信公众号消息的基类
 7  */
 8
 9 @Setter
10 @Getter
11 @ToString
12 @AllArgsConstructor
13 @NoArgsConstructor
14 @Builder
15 public class WxMessage {
16     // 开发者微信号
17     private String ToUserName;
18     // 发送方帐号(一个OpenID)
19     private String FromUserName;
20     // 消息创建时间 (整型)
21     private long CreateTime;
22     // 消息类型(text/image/location/link)
23     private String MsgType;
24     // 消息id,64位整型
25     private long MsgId;
26 }

文本信息类 继承自基类:

 1 package com.encore.model;
 2
 3 import lombok.Getter;
 4 import lombok.NoArgsConstructor;
 5 import lombok.Setter;
 6 import org.springframework.beans.BeanUtils;
 7
 8 /**
 9  *  文本消息
10  */
11
12 @Getter
13 @Setter
14 @NoArgsConstructor
15 public class TextMessage extends WxMessage {
16
17     private String Content;// 文本消息内容
18
19     //用来把基类的属性值复制给子类
20     public static TextMessage adapt(WxMessage msg){
21         TextMessage textMessage = new TextMessage();
22         BeanUtils.copyProperties(msg, textMessage);
23         return textMessage;
24     }
25 }

第二步: controller post接收方式,中间会涉及到读取和写入xml,util类会在最后附上

 1 @RequestMapping(value = "/view.json", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
 2     @ResponseBody
 3     public String receiveMessage(HttpServletRequest request){
 4
 5         //1. 获取微信服务器发送的消息,转换成map对象
 6         Map<String, String> map = MessageUtil.parseXmlToMap(request);
 7         // 2. 获取详细的信息
 8         // 发送方帐号(open_id)
 9         String fromUserName = map.get("FromUserName");
10         // 公众帐号
11         String toUserName = map.get("ToUserName");
12         // 消息类型
13         String msgType = map.get("MsgType");
14         // 消息内容
15         String content = map.get("Content");
16         // 消息id
17         String msgId = map.get("MsgId");
18
19         //3. 定义回复消息对象
20         String respMsg = "";
21
22         // 也可以用new,然后一个属性一个属性的set
23         // 微信消息的基类
24         //set属性值的时候,注意:ToUserName 和 FromUserName的值要反过来!是坑!是坑!是坑!
25         WxMessage msg = WxMessage.builder().FromUserName(toUserName).ToUserName(fromUserName).MsgType(msgType).MsgId(Long.parseLong(msgId))
26                 .CreateTime(new Date().getTime()).build();
27
28         if (RESP_MESSAGE_TYPE_TEXT.equals(msgType)){//文本消息
29             //要回复的消息内容
30             String resultContent = "";
31             if ("python".equals(content)){
32                 resultContent = "人生苦短,我用python";
33             }else if ("php".equals(content) || "PHP".equals(content)){
34                 resultContent = "PHP是世界上最好的语言";
35             }else if ("java".equals(content) || "JAVA".equals(content)){
36                 resultContent = "JAVA太特么复杂了";
37             }else if ("js".equals(content) || "javascript".equals(content)){
38                 resultContent = "老子是脚本!跟java没半毛钱关系!";
39             }else {
40                 resultContent = "您的开发语言是:"+content;
41             }
42             TextMessage textMessage = TextMessage.adapt(msg);
43             textMessage.setContent(resultContent);
44             respMsg = MessageUtil.parseMsgToXml(textMessage, TextMessage.class);
45         }
46
47         return respMsg;
48     }

最后附上读取和写入xml的工具类:

 1 package com.encore.util;
 2
 3 import com.encore.model.WxMessage;
 4 import com.thoughtworks.xstream.XStream;
 5 import org.dom4j.Document;
 6 import org.dom4j.DocumentException;
 7 import org.dom4j.Element;
 8 import org.dom4j.io.SAXReader;
 9
10 import javax.servlet.http.HttpServletRequest;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 public class MessageUtil {
18
19
20     /**
21      *  接收request对象,读取xml内容,转换成map对象
22      * @param request
23      * @return
24      */
25     public static Map<String, String> parseXmlToMap(HttpServletRequest request){
26         Map<String, String> map = new HashMap<>();
27         SAXReader reader = new SAXReader();
28         InputStream ins = null;
29         try {
30             ins = request.getInputStream();
31         } catch (IOException e1) {
32             e1.printStackTrace();
33         }
34         Document doc = null;
35         try {
36             doc = reader.read(ins);
37             Element root = doc.getRootElement();
38             List<Element> list = root.elements();
39             for (Element e : list) {
40                 map.put(e.getName(), e.getText());
41             }
42             return map;
43         } catch (DocumentException e1) {
44             e1.printStackTrace();
45         }finally{
46             try {
47                 if (null != ins){
48                     ins.close();
49                 }
50             } catch (IOException e) {
51                 e.printStackTrace();
52             }
53         }
54         return null;
55     }
56
57     /**
58      * 将消息转换成xml格式的字符串
59      * @param msg 各种信息类,如文本信息类,图片信息类,音频信息类等。(都是WxMessage的子类)
60      * @param child 用来确定到底是哪一种子类
61      * @return
62      */
63     public static String parseMsgToXml(WxMessage msg, Class child){
64         XStream xstream = new XStream();
65         xstream.alias("xml", child);
66         return xstream.toXML(msg);
67     }
68 }

至此基本步骤已经完成,具体什么关键字回复什么内容全屏自己设置。

原文地址:https://www.cnblogs.com/ilovegenius/p/9565319.html

时间: 2024-08-22 20:12:57

Java微信公众号开发----关键字自动回复消息的相关文章

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler

《初识Java微信公众号开发》 学习中遇到的困难

前一段时间无聊的时候,在慕课网上自学了一点点微信公众号开发(受学姐威胁). 慕课网教程的地址:http://www.imooc.com/learn/368 毕竟是免费的课程,不可能讲的那么详细.所以我吧我遇到的问题跟大家分享一下. 这是我照着课程敲的代码(IDE是Eclipse): https://github.com/Zuosy/WeiXin 发到github上面了. 为了这个,我还专门到廖大的网站上学了一遍Git. 廖大的Git教程传送们:https://www.liaoxuefeng.co

JAVA微信公众号开发入门

好久没进博客,最近应某人的要求,要每周写一篇博客,故此今天就把我这周刚学的微信公众号开发的知识在此总结总结,以供后人查阅.我写博客都是简要白话文,勿喷. 1.为什么要学微信公众号开发 微信的用户量庞大,微信公众号的完善和不断的开放力度,企业市场对公众号开发的需求不断增加 2.如何搭建微信开发平台 开发工具什么的就不说了,因为微信是要外网访问的,所有你必须有个网上的服务器资源,而且你必须申请一个微信公众号. 2.1申请微信公众号 公众号有3种:订阅号,服务号,企业号 区别是企业号适合内部人使用,因

Java微信公众号开发

微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个web平台.微信公众账号的种类可以分为3种,并且一旦选定不可更改.按照功能的限制从小到大依次为:订阅号.服务号.企业号.个人只能注册订阅号.注册地址:https://mp.weixin.qq.com/. 开发环境的准备 微信公众号 外网映射工具(开发调试) 与微信的对接的URL应该满足以下的条件: 在公网上能够访问 只支持80端口 映射工具有很多,例如花生壳,ngrok可以将内网映射到公网上面,这样就可以使用公网访问本机的网络服务.下

微信公众号开发教程[005]-消息管理-消息加解密

一.配置公众号消息加解密方式 在公众号官方管理后台->开发->基本配置->修改配置上有3种方式,如下: 其中,EncodingAESKey可以随机生成. 加解密方式说明: 1).明文模式:微信服务器向公众号服务器(即我们要处理的http://szuzsq.tunnel.qydev.com/weixin/index.php)发送的xml结构是原始的,没有加密.如下: <xml> <ToUserName><![CDATA[gh_733c42e0aee9]]>

微信公众号开发教程[003]-消息管理-接收消息

当微信用户向公众号发送消息时,微信服务器会向公众号配置的服务器URL地址发送请求,并将相关内容包装成一定格式的xml发送到这个服务器;响应时,这个服务器只要回复特定格式的xml字符串给微信服务器,微信服务器即可向微信用户的客户端转发这条回复消息.(假设公众号开发模式已开启,以后的教程,如果没有特别说明,都是如此).如下图: 例如,文本消息的xml结构如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> &

Java微信公众号开发-外网映射工具配置

一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ngrok.cc它的服务基于ngrok实现,防止ngrok官网被墙不能访问,把服务器架设在了香港,不仅大大加快了大家的访问速度,还不怕被墙了,而且完全免费.官网地址::http://ngrok.cc/ 搭建步骤: 1.下载客户端 下载链接:http://www.ngrok.cc/index.php

java微信公众号开发思路

方法一:不开启开发模式,直接在自定义菜单中跳转到网页,适用于流量较小的公众号. 方法二:开启开发者模式,关闭自带的自定义菜单和消息回复,接入自己开发的应用 1.接入校验:创建servlet,在doGet()中进行校验,校验成功表示微信和当前应用接入成功 2.响应用户发送的消息:在servlet的doPost()中进行响应xml消息,xml消息有以下属性: FromUserName,ToUserName,MsgType,Content 其中MsgType又分event,text,voice,vid

4.微信公众号开发:自动回复用户消息

在上一篇文章里 我们配置好和微信交互的URL里 我们就能接收到微信用户发送的消息了 我只需要判断消息的类型或者其他处理其他的业务逻辑 比如你可以根据他发的关键字来处理 他发订单号 你收到后可以去数据库查询 然后在反馈给他 这里我们就简单回复好了 比如他发送什么消息 我们就返回什么消息 首先是我封装的微信类 <?php /** * 微信公众平台操作类 */ class WeChat { private $_appid; private $_appsecret; //微信公众平台请求开发者的服务器需