1.数据交互原理
首先,我们要明白,普通微信用户向公众号发送信息,然后公众号服务器回复一条消息的整个过程,数据是怎样传递的。
1)用户向微信服务器发送请求
2)微信服务器向公众号服务器发一条xml数据包
3)公众号服务器解析这个xml数据包,进行逻辑处理,处理结果再打包成xml文件返回给微信服务器
4)微信服务器再将信息返回给微信客户端
2.接收文本消息
微信服务器向公众号服务器发送的xml文件内容如下:
ToUserName:开发者微信号
FromUserName:发送方帐号(一个OpenID)
CreateTime:消息创建时间 (整型)
MsgType:text
Content:文本消息内容
MsgId:消息id,64位整型
我们在服务器这边首先是要将xml文件进行解析,创建一个工具类MessageUtil,然后编写一个xmlToMap()方法
/*
* xml转为map集合
*/
public static Map<String,String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{
Map<String,String> map=new HashMap<String,String>();
SAXReader reader=new SAXReader();
InputStream ins=request.getInputStream();
Document doc=reader.read(ins);
Element root=doc.getRootElement();
List<Element> list=root.elements();
for(Element e:list){
map.put(e.getName(), e.getText());
}
ins.close();
return map;
}
在公众号服务器url对应的servlet里,我们可以重写一下doPost()方法,借助上述方法将xml文件的内容取出
Map<String,String> map=MessageUtil.xmlToMap(req);
String toUserName=map.get("ToUserName");
String fromUserName=map.get("FromUserName");
String msgType=map.get("MsgType");
String content=map.get("Content");
3.回复文本消息
ToUserName:接收方帐号(收到的OpenID)
FromUserName:开发者微信号
CreateTime:消息创建时间 (整型)
MsgType:text
Content:回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
首先,我们创建一个文本消息类TextMessage,包含以上内容,
第二,在MessageUtil工具类中,创建一个方法,将文本消息对象转换为xml文件
/*
* 将文本消息对象转换为xml
*/
public static String textMessageToXml(TextMessage textMessage){
XStream xstream=new XStream(new DomDriver("UTF-8"));
xstream.alias("xml",textMessage.getClass());
return xstream.toXML(textMessage);
}
第三,在工具类中,创建一个方法,组装文本消息的内容
public static String initText(String toUserName,String fromUserName,String content){
TextMessage text=new TextMessage();
text.setFromUserName(toUserName);
text.setToUserName(fromUserName);
text.setMsgType(MESSAGE_TEXT);
text.setCreateTime((new Date().getTime()));
text.setContent(content);
return textMessageToXml(text);
}
最后,我们根据接收的消息的类型和内容,判断回复什么样的内容。重写doPost()方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter out=resp.getWriter();
try {
Map<String,String> map=MessageUtil.xmlToMap(req);
String toUserName=map.get("ToUserName");
String fromUserName=map.get("FromUserName");
String msgType=map.get("MsgType");
String content=map.get("Content");
String message=null;
String str=null;
if(MessageUtil.MESSAGE_TEXT.equals(msgType)){
if("1".equals(content)){
message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.firstMenu());
} else if("2".equals(content)){
message=MessageUtil.initNewsMessage(toUserName, fromUserName);
} else if("3".equals(content)){
message=MessageUtil.initImageMessage(toUserName, fromUserName);
} else if("?".equals(content)||"?".equals(content)){
message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
}
} else if(MessageUtil.MESSAGE_EVENT.equals(msgType)){
String eventType=map.get("Event");
if(MessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)){
message=MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
}
}
out.print(message);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
out.close();
}
}
其中在工具类中
public static final String MESSAGE_TEXT="text";