先声明一下,这是一个maven工程
pom文件需要的依赖:
1 <dependency>
2 <groupId>dom4j</groupId>
3 <artifactId>dom4j</artifactId>
4 <version>1.6</version>
5 </dependency>
6 <dependency>
7 <groupId>commons-io</groupId>
8 <artifactId>commons-io</artifactId>
9 <version>2.5</version>
10 </dependency>
11 <dependency>
12 <groupId>com.thoughtworks.xstream</groupId>
13 <artifactId>xstream</artifactId>
14 <version>1.4.9</version>
15 </dependency>
16 <dependency>
17 <groupId>javax.servlet</groupId>
18 <artifactId>javax.servlet-api</artifactId>
19 <version>3.1.0</version>
20 </dependency>
微信消息都是基于xml文件进行接收发送的
微信文本消息的参数:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
<!--参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType text
Content 文本消息内容
MsgId 消息id,64位整型
-->
微信回复文本消息的参数
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
<!--参数 是否必须 描述
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 text
Content 是 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
-->
我会在相应的代码上加上注释,其他对应图片消息参数,以及回复图片消息参数、图文消息参数等等 请参考微信开发文档。
附上微信公众号接口文档链接:点击这里
二话不说 先附上主代码:
注: xml解析:本文使用的是xtream进行xml与java对象之间的转换;对于xml解析还可以使用其他方法 如:dom4j等等 我这里就不一一列举了
import com.replymessage.*;
import com.requestmessage.RequestTextMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.util.Articles;
import com.util.Item;
import com.util.Music;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 微信回复消息
*/
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 writer = response.getWriter();
String echostr = request.getParameter("echostr");
echostr = new String(echostr.getBytes("ISO-8859-1"),"UTF-8");
writer.println(echostr);
//当你提交成为开发者的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("home");
music.setDescription(" family 想家了吗");
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;
}
}
当你看到这里 说明你成功一半了,下面我们继续来完成这些小瑕疵
这时候需要:根据xml标签创建对应的实体类
实体类一:音乐消息
import com.util.Music;
/**
* 音乐消息实体类
*/
public class ReplyMusicMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private com.util.Music Music;
private String funcFlag;
//这里的funcFlag,微信平台接口文档里没有,但是必须写上,不然会收不到返回的信息
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public Music getMusic() {
return Music;
}
public void setMusic(Music music) {
Music = music;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
}
实体类二:文本消息(常用)
/**
* 文本消息实体类
*/
public class ReplyTextMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private String content;
private String funcFlag;
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
}
实体类三:图文消息(常用)
import com.util.Articles;
/**
* 图文消息实体类
*/
public class ReplyTuwenMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private int articleCount;
private Articles articles;
private String funcFlag;
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public int getArticleCount() {
return articleCount;
}
public void setArticleCount(int articleCount) {
this.articleCount = articleCount;
}
public Articles getArticles() {
return articles;
}
public void setArticles(Articles articles) {
this.articles = articles;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
}
请求消息实体类
/**
* 请求消息实体类
*/
public class RequestTextMessage {
private String toUserName;
private String fromUserName;
private String createTime;
private String messageType;
private String content;
private String msgId;
//getters,setters
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMsgId() {
return msgId;
}
public void setMsgId(String msgId) {
this.msgId = msgId;
}
}
音乐消息实体类
/**
* 音乐消息实体类
*/
public class Music {
private String title;
private String description;
private String musicUrl;
private String hqMusicUrl;
//getters,setters
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getMusicUrl() {
return musicUrl;
}
public void setMusicUrl(String musicUrl) {
this.musicUrl = musicUrl;
}
public String getHqMusicUrl() {
return hqMusicUrl;
}
public void setHqMusicUrl(String hqMusicUrl) {
this.hqMusicUrl = hqMusicUrl;
}
}
xml嵌套标签实体类
/**
* xml嵌套标签实体类
*/
public class Articles {
private Item item;
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
}
xml嵌套标签实体类
/**
* xml嵌套标签实体类
*/
public class Item {
private String title;
private String description;
private String picUrl;
private String url;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}