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

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

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

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

附上解析xml类的依赖:

  <!-- dom对象读取写入xml文件 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.9</version>
</dependency>

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

基类:

 package com.encore.model;

 import lombok.*;

 /**
* 微信公众号消息的基类
*/ @Setter
@Getter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class WxMessage {
// 开发者微信号
private String ToUserName;
// 发送方帐号(一个OpenID)
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型(text/image/location/link)
private String MsgType;
// 消息id,64位整型
private long MsgId;
}

文本信息类 继承自基类:

 package com.encore.model;

 import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.beans.BeanUtils; /**
* 文本消息
*/ @Getter
@Setter
@NoArgsConstructor
public class TextMessage extends WxMessage { private String Content;// 文本消息内容 //用来把基类的属性值复制给子类
public static TextMessage adapt(WxMessage msg){
TextMessage textMessage = new TextMessage();
BeanUtils.copyProperties(msg, textMessage);
return textMessage;
}
}

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

 @RequestMapping(value = "/view.json", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody
public String receiveMessage(HttpServletRequest request){ //1. 获取微信服务器发送的消息,转换成map对象
Map<String, String> map = MessageUtil.parseXmlToMap(request);
// 2. 获取详细的信息
// 发送方帐号(open_id)
String fromUserName = map.get("FromUserName");
// 公众帐号
String toUserName = map.get("ToUserName");
// 消息类型
String msgType = map.get("MsgType");
// 消息内容
String content = map.get("Content");
// 消息id
String msgId = map.get("MsgId"); //3. 定义回复消息对象
String respMsg = ""; // 也可以用new,然后一个属性一个属性的set
// 微信消息的基类
//set属性值的时候,注意:ToUserName 和 FromUserName的值要反过来!是坑!是坑!是坑!
WxMessage msg = WxMessage.builder().FromUserName(toUserName).ToUserName(fromUserName).MsgType(msgType).MsgId(Long.parseLong(msgId))
.CreateTime(new Date().getTime()).build(); if (RESP_MESSAGE_TYPE_TEXT.equals(msgType)){//文本消息
//要回复的消息内容
String resultContent = "";
if ("python".equals(content)){
resultContent = "人生苦短,我用python";
}else if ("php".equals(content) || "PHP".equals(content)){
resultContent = "PHP是世界上最好的语言";
}else if ("java".equals(content) || "JAVA".equals(content)){
resultContent = "JAVA太特么复杂了";
}else if ("js".equals(content) || "javascript".equals(content)){
resultContent = "老子是脚本!跟java没半毛钱关系!";
}else {
resultContent = "您的开发语言是:"+content;
}
TextMessage textMessage = TextMessage.adapt(msg);
textMessage.setContent(resultContent);
respMsg = MessageUtil.parseMsgToXml(textMessage, TextMessage.class);
} return respMsg;
}

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

 package com.encore.util;

 import com.encore.model.WxMessage;
import com.thoughtworks.xstream.XStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class MessageUtil { /**
* 接收request对象,读取xml内容,转换成map对象
* @param request
* @return
*/
public static Map<String, String> parseXmlToMap(HttpServletRequest request){
Map<String, String> map = new HashMap<>();
SAXReader reader = new SAXReader();
InputStream ins = null;
try {
ins = request.getInputStream();
} catch (IOException e1) {
e1.printStackTrace();
}
Document doc = null;
try {
doc = reader.read(ins);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for (Element e : list) {
map.put(e.getName(), e.getText());
}
return map;
} catch (DocumentException e1) {
e1.printStackTrace();
}finally{
try {
if (null != ins){
ins.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
} /**
* 将消息转换成xml格式的字符串
* @param msg 各种信息类,如文本信息类,图片信息类,音频信息类等。(都是WxMessage的子类)
* @param child 用来确定到底是哪一种子类
* @return
*/
public static String parseMsgToXml(WxMessage msg, Class child){
XStream xstream = new XStream();
xstream.alias("xml", child);
return xstream.toXML(msg);
}
}

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

补充:如果想让公众号除了自己设定的几个关键字以外不进行任何回复,则直接返回空字符串""即可,避免出现  “该公众号提供的服务出现故障,请稍后重试”  错误!

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

  1. Java微信公众号开发梳理

    Java微信公众号开发梳理 现在微信公众平台的开发已经越来越普遍,这次开发需要用到微信公众平台.因此做一个简单的记录,也算是给那些没踩过坑的童鞋一些启示吧.我将分几块来简单的描述一下,之后会做详细的说 ...

  2. Java微信公众号开发

    微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个web平台.微信公众账号的种类可以分为3种,并且一旦选定不可更改.按照功能的限制从小到大依次为:订阅号.服务号.企业号.个人只能注册订阅号 ...

  3. PHP微信公众号开发之自动回复

    先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...

  4. 初识Java微信公众号开发

    选定类型后不可更改 企业号与服务号,订阅号的区别 公众号微信注册流程: 个人就选择订阅号 外网映射 必须要使用映射工具将本地的地址映射到公网上去 介绍一个ngrok 首先下载ngork,例如保存在D盘 ...

  5. Java 微信公众号开发--- 接入微信

    开发微信公众号在没有正式的公众平台账号时,我们可以使用测试平台账号--- 测试平台申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandb ...

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

    一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...

  7. Java微信公众号开发----定时获取access_token并保存到redis中

    本人原本是想做微信公众号菜单的创建修改删除等操作的,但是发现需要access_token,通过阅读文档,发现文档要求有以下几点: 1.access_token 获取后有效期是2小时 2.access_ ...

  8. Java微信公众平台开发(八)--多媒体消息回复之音乐

    我们上一篇写了关注出发图片的回复.想着在发送一次音乐,最后基于回复消息分类情况下,实现一个简单的只能话回复.先附一张大致效果图. 下面我们进入代码阶段. (一)修改消息转发器MsgDispatcher ...

  9. Java微信公众平台开发(八)--多媒体消息回复

    转自:http://www.cuiyongzhi.com/post/46.html 之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消 ...

随机推荐

  1. IT兄弟连 Java语法教程 Java开发环境 配置Java环境变量

    在安装完JDK后,我们需要配置系统的环境变量,否则在控制台中使用JDK为我们提供的工具时将出现如图12所示的错误信息. 图12  未配置环境变量时执行java命令提示的错误信息 当出现这样的提示信息时 ...

  2. C - Distinct Substrings (模板)

    https://vjudge.net/problem/SPOJ-DISUBSTR 有两种方式来求去除重读的子串 #include <bits/stdc++.h> using namespa ...

  3. JSONPath中的表达式

    在JsonPath中使用表达式是一个非常好的功能,可以使用简洁和复杂的JsonPath.JsonPath中的表达式基本上是评估为布尔值的代码片段.基于结果,仅选择满足标准的节点.让我们看一下它的更多内 ...

  4. 15.更新和删除数据--SQL

    一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...

  5. virtualenv模块安装

    依赖包管理模块(virtualenv) virtualenv是Python的虚拟环境,可以在同一台PC隔离不同的python开发环境.virtualenv可以创建一个隔离的python环境(沙盒).使 ...

  6. Spark Mllib里的Mllib基本数据类型(图文详解)

    不多说,直接上干货! Spark Mllib基本数据类型,根据不同的作用和应用场景,分为四种不同的类型 1.Local  vector : 本地向量集,主要向spark提供一组可进行操作的数据集合 2 ...

  7. Webstorm 激活

    注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址: http://idea.iteblog.com/key.php 点击:Acti ...

  8. MVC FileResult

    你如何将文件传送给用户取决于你最开始如何存储它,如果你将文件存入数据库,你会用流的方式将文件返还给用户,如果你将文件存在硬盘中,你只需要提供一个超链接即可,或者也可以以流的方式.每当你需要以流的方式将 ...

  9. Java基本语法和变量

    1基本语法 1.1 标识符.关键字 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等. 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,不能以数字开头, 不 ...

  10. DetachedCriteria的简单使用

    一. DetachedCriteria使得hibernate能够对查询条件进行面向对象的方式来组装.其创建方式有两种: 1.1直接用class创建:DetachedCriteria criteria  ...