利用微信公众平台实现自动回复消息—java版
最近公司需要拿微信公众平台做个东西,所以就开始了最基本学习,网上很多是php版的,对于我这个只会java,不会php的就只能在网上找点只言片语来一点一点学习了。不费话了直接贴图看效果(很简单的)。

不会做关注时就回复信息,所以必须先发送“?”,才能出现提示。回复“1”和“其他”都是返回文字信息,“2”是音乐信息,“3”是图文信息。
好了,下面进入正题。
1、首先必须开通微信公中平台,还得申请到高级功能的(这个点比较坑,我等了两天才申请到的),关于申请公众平台我就不说了,网上很多介绍,自己看吧。
2、必须有自己的服务器资源,因为公众平台开发者模式开启时,必须填写接口配置信息(成为开发者)。

服务器资源我是用的是百度开发者中心来创建自己的应用。百度开发者中心:http://developer.baidu.com/
成为微信公众平台开发者前必须发布好自己的服务器资源,因为微信服务器将发送GET请求到填写的URL上(后面详细介绍)。
3、创建自己的应用。

这是整个项目结构。
下面逐一介绍:
public class WbChat extends HttpServlet{
private static final long serialVersionUID = 1L;
public WbChat() {
super();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//这里没有对发送信息者进行验证,直接返回了,要加验证的话自己去百度吧
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
String echo = request.getParameter("echostr");
echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8");
pw.println(echo);
//当你提交成为开发者的URL和Token时,微信服务器将发送GET请求到填写的URL上,
//只有你返回参数echostr时,他才会认为你这个接口是通的,才会提交成功
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 当你用微信给平台发送信息时就会到这里
// 回复音乐和图文消息,我都写死了,自己可以根据自己的需要加相应的处理
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8");
RequestTextMessage textMsg = null;
try {
textMsg = getRequestTextMessage(wxMsgXml);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer replyMsg = new StringBuffer();
String receive = textMsg.getContent().trim();
String returnXml = null;
if (textMsg != null&&!receive.equals("")) {
if (receive.equals("?")||receive.equals("?")) {
replyMsg.append("欢迎使用微信平台!");
replyMsg.append("\r\n1、当前时间");
replyMsg.append("\r\n2、听音乐");
replyMsg.append("\r\n3、看图文");
replyMsg.append("\r\n其他、回音壁请直接输入文字信息");
returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
} else if (receive.equals("2")) {
//回复音乐信息
returnXml = getReplyMusicMessage(textMsg.getFromUserName(),textMsg.getToUserName());
} else if (receive.equals("3")) {
//回复图文
returnXml = getReplyTuwenMessage(textMsg.getFromUserName(),textMsg.getToUserName());
} else if (receive.equals("1")) {
//回复时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
replyMsg.append("当前时间\r\n"+df.format(new Date()));
returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
} else {
replyMsg.append("收到: " + textMsg.getContent());
returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
}
} else {
replyMsg.append("别闹了,这谁看得懂啊!");
returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),textMsg.getToUserName());
}
pw.println(returnXml);
}
// 获取推送文本消息
private RequestTextMessage getRequestTextMessage(String xml){
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", RequestTextMessage.class);
xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
xstream.aliasField("Content", RequestTextMessage.class, "content");
xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");
RequestTextMessage requestTextMessage = (RequestTextMessage)xstream.fromXML(xml);
return requestTextMessage;
}
// 回复文本消息
private String getReplyTextMessage(String content, String fromUserName,String toUserName){
ReplyTextMessage we = new ReplyTextMessage();
we.setMessageType("text");
we.setFuncFlag("0");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setContent(content);
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTextMessage.class);
xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType");
xstream.aliasField("Content", ReplyTextMessage.class, "content");
xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag");
String xml =xstream.toXML(we);
return xml;
}
// 回复音乐消息
private String getReplyMusicMessage(String fromUserName,String toUserName){
ReplyMusicMessage we = new ReplyMusicMessage();
Music music = new Music();
we.setMessageType("music");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
we.setFuncFlag("0");
music.setTitle("回家|X-man");
music.setDescription("萨克斯 回家 勾起你想家的愁思...");
String url = "http://bcs.duapp.com/yishi-music/%E5%9B%9E%E5%AE%B6.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:LdYZ%2FLXohKa6YCy9gbxL%2B1mZ4Co%3D";
String url2 = "http://bcs.duapp.com/yishi-music/X-man.mp3?sign=MBO:97068c69ccb2ab230a497c59d528dcce:cYV%2B%2Fq2Tlv2de6gqecZynCyIm3k%3D";
music.setMusicUrl(url);
music.setHqMusicUrl(url2);
we.setMusic(music);
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyMusicMessage.class);
xstream.aliasField("ToUserName", ReplyMusicMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyMusicMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyMusicMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyMusicMessage.class, "messageType");
xstream.aliasField("FuncFlag", ReplyMusicMessage.class, "funcFlag");
xstream.aliasField("Music", ReplyMusicMessage.class, "Music");
xstream.aliasField("Title", Music.class, "title");
xstream.aliasField("Description", Music.class, "description");
xstream.aliasField("MusicUrl", Music.class, "musicUrl");
xstream.aliasField("HQMusicUrl", Music.class, "hqMusicUrl");
String xml =xstream.toXML(we);
return xml;
}
// 回复图文消息
private String getReplyTuwenMessage(String fromUserName,String toUserName){
ReplyTuwenMessage we = new ReplyTuwenMessage();
Articles articles = new Articles();
Item item = new Item();
we.setMessageType("news");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
we.setFuncFlag("0");
we.setArticleCount(1);
item.setTitle("俊介");
item.setDescription("俊介(SHUNSUKE)是Twitter上现在最流行的偶像犬,是哈多利系博美犬(即俗称英系博美),因为在网上卖萌而走红网络。");
item.setPicUrl("http://bcs.duapp.com/yishi-music/111.jpg?sign=MBO:97068c69ccb2ab230a497c59d528dcce:hmzcBYxgI4yUaTd9GvahO1GvE%2BA%3D");
item.setUrl("http://baike.baidu.com/view/6300265.htm");
articles.setItem(item);
we.setArticles(articles);
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTuwenMessage.class);
xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");
xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag");
xstream.aliasField("item", Articles.class, "item");
xstream.aliasField("Title", Item.class, "title");
xstream.aliasField("Description", Item.class, "description");
xstream.aliasField("PicUrl", Item.class, "picUrl");
xstream.aliasField("Url", Item.class, "url");
String xml =xstream.toXML(we);
return xml;
}
}
WbChat
public class ReplyMusicMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private Music Music;
private String funcFlag;
//这里的funcFlag,微信平台接口文档里没有,但是必须写上,不然会收不到返回的信息
//getters、setters
}
ReplyMusicMessage
public class ReplyTextMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private String content;
private String funcFlag;
// getters,setters
}
ReplyTextMessage
public class ReplyTuwenMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private int articleCount;
private Articles Articles;
private String funcFlag;
//getters,setters
}
ReplyTuwenMessage
public class RequestTextMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private String content;
private String msgId;
//getters,setters
}
RequestTextMessage
public class Articles {
private Item item;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
Articles
public class Item {
private String title;
private String description;
private String picUrl;
private String url;
//getters,setters
}
Item
public class Music {
private String title;
private String description;
private String musicUrl;
private String hqMusicUrl;
//getters,setters
}
Music
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.main.WbChat</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/wbchat</url-pattern>
</servlet-mapping>
web.xml配置
还要加四个jar包:
利用MyEclipse直接把工程打为war包,上传到百度开发者中心,并上线该应用。
4、成为开发者,开启开发模式。

将百度开发者中心中的当前域名+/wbchat 添加到微信平台的URL处,Token可以随便填(因为我没有判断Token)。
5、大功告成,可以在微信上添加该公众账号聊天了。
小提示:
1、调试时,微信发送消息却没有受到信息,可以去看看百度开发者中心,在应用版本管理中找到该应用,然后点击高级下的日志,查看日志来看出什么问题了
2、下载jar包地址:http://jarfiles.pandaidea.com/
3、不要听百度开发者中心说的那个”如何提交代码“,它是使用svn,它给的下载svn地址下的是svn1.8的,根本就checkout不了工程,如果想使用svn的话,就得去下载svn1.6的版本来使用。我是使用上传更新war包来更新工程的,这样在自己的MyEclipse中直接编写。
利用微信公众平台实现自动回复消息—java版的更多相关文章
- 使用Java语言开发微信公众平台(四)——图文消息的发送与响应
在上一篇文章中,我们实现了被关注回复与关键词回复功能.在用户关注的时候自动推送功能菜单,并根据用户输入的关键词,回复特定信息.但是,我们只能回复文本消息给用户,如何才回复一条图文消息呢?本周,我们一起 ...
- 使用Java语言开发微信公众平台(七)——音乐消息的回复
在上一节课程中,我们学习了图片消息的回复功能.根据微信公众平台的消息类型显示,微信共支持文本.图片.语音.视频.音乐.图文等6种消息类型的回复: 其中,我们已经实现了文本.图文.图片等消息的回复处理, ...
- Java微信公众平台开发_03_消息管理之被动回复消息
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.回调url 上一节,我们启用服务器配置的时候,填写了一个服务器地址(url),如下图, ...
- 微信公众号批量爬取java版
最近需要爬取微信公众号的文章信息.在网上找了找发现微信公众号爬取的难点在于公众号文章链接在pc端是打不开的,要用微信的自带浏览器(拿到微信客户端补充的参数,才可以在其它平台打开),这就给爬虫程序造成很 ...
- David Camp 微信公众平台开发官方内容拓展版---PHP版本
微信公众平台开发(一) 配置接口 微信公众平台开发(二) 微信公众平台示例代码分析 微信公众平台开发(三) 订阅事件(subscribe)处理 微信公众平台开发(四) 简单回复功能开发 微信公众平台开 ...
- 最新微信公众平台js sdk整合PHP版
由于没有持续关注微信公众平台相关的开发,所以看到这个东西时,都没有耐心看完开发文档,或者不知道重点. 重点在哪呢?重点在示例代码:http://mp.weixin.qq.com/wiki/7/aaa1 ...
- java版微信公众平台自定义菜单创建代码实现
微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...
- 微信公众平台自定义菜单创建代码实现—java版
搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知道你们什么感觉. 我知道是post一个带参数的 ...
- 使用Java语言开发微信公众平台(三)——被关注回复与关键词回复
在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信可提 ...
随机推荐
- Asp.net实现URL重写
原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读 ...
- 基于HTTP/2和protobuf的RPC框架:GRPC
谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...
- tomcat加载类的顺序
/bin:存放启动和关闭tomcat的脚本文件: /conf:存放tomcat的各种配置文件,比如:server.xml /server/lib:存放tomcat服务器所需要的各种jar文件(jar文 ...
- jq入门--选择器
选择器是JQuery一大特色,所有的DOM操作.事件操作.Ajax操作都离不开选择器.熟练掌握JQuery的选择器,可以节省很多代码,很大程序上简化我们的脚本编程工作. JQuery的选择器很类似于样 ...
- SQL点滴28—一个简单的存储过程
原文:SQL点滴28-一个简单的存储过程 在表中写入一条数据同事要向另外一个表中写入信息,所以会使用到事务.实际使用的时候还会一次向一个表中吸入多条数据,下面的存储过程,将字符串拆分成数组然后写入到表 ...
- ViewPaper实现轮播广告条
使用V4包中的viewPaper组件自己定义轮播广告条效果. 实现viewpaper的滑动切换和定时自己主动切换效果. 上效果图 布局文件 <RelativeLayout xmlns:andro ...
- 关于easyui的tab,layout,datagrid嵌套的问题
我的项目使用easyui作为前台的展示框架现在页面中是一个layout布局(分上,左,中)在左边是一些菜单,点击后,在中间部分增加一个tab显示内容而增加的tab里面是显示一些列表数据,列表上面是查询 ...
- solr连接数据库
solr与.net系列课程(三)solr连接数据库 solr与.net系列课程(三)solr连接数据库 上一章直接讲述的配置文件把大部分人看的很迷惑,大家都想听的是solr到底是怎么用的,好,这 ...
- Linux内核策略介绍
Linux内核策略介绍学习笔记 主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...
- WCF的简单
WCF的简单 WCF的学习之旅 一.WCF的简单介绍 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows ...