被动回复用户消息官方文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543&token=&lang=zh_CN
图文消息XML格式
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
<item>
<Title><![CDATA[title]]></Title>
<Description><![CDATA[description]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
</xml>
创建BaseMessage
package com.imooc.po;
public class BaseMessage {
private String ToUserName;
private String FromUserName;
private long CreateTime;
private String MsgType;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
}
创建News类
package com.imooc.po;
public class News {
private String Title;
private String Description;
private String PicUrl;
private String Url;
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
创建NewsMessage
package com.imooc.po;
import java.util.List;
public class NewsMessage extends BaseMessage{
private int ArticleCount;
private List<News> Articles;
public int getArticleCount() {
return ArticleCount;
}
public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
}
public List<News> getArticles() {
return Articles;
}
public void setArticles(List<News> articles) {
Articles = articles;
}
}
在MessageUtil中新增逻辑
package com.imooc.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.imooc.po.News;
import com.imooc.po.NewsMessage;
import com.imooc.po.TextMessage;
import com.thoughtworks.xstream.XStream;
public class MessageUtil {
public final static String MESSAGE_TEXT = "text";
public final static String MESSAGE_IMAGE = "image";
public final static String MESSAGE_VOICE = "voice";
public final static String MESSAGE_VEDIO = "vedio";
public final static String MESSAGE_NEWS = "news";
public final static String MESSAGE_LINK = "link";
public final static String MESSAGE_LOCATION = "location";
public final static String MESSAGE_EVENT = "event";
public final static String MESSAGE_SUBSCRIBE = "subscribe";
public final static String MESSAGE_UNSUBSCRIBE = "unsubscribe";
public final static String MESSAGE_CLICK = "CLICK";
public final static String MESSAGE_VIEW = "VIEW";
/**
* xml转成map
* @param request
* @return
* @throws Exception
*/
public static Map<String, String> xml2Map(HttpServletRequest request) throws Exception {
Map<String, String> map = new HashMap<String,String>();
InputStream inputStream = request.getInputStream();
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elements = root.elements();
for(Element element : elements){
map.put(element.getName(), element.getText());
}
return map;
}
/**
* 将文本消息对象转成XML
* @param textMessage
* @return
*/
public static String textMessage2XML(TextMessage textMessage) {
XStream xStream = new XStream();
xStream.alias("xml", textMessage.getClass());
return xStream.toXML(textMessage);
}
/**
* 文本消息回复XML
* @param toUserName
* @param fromUserName
* @param content
* @return
*/
public static String initText(String toUserName,String fromUserName,String content) {
TextMessage textMessage = new TextMessage();
textMessage.setContent(content);
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setMsgType(TextMessage.MESSAGE_MsgType_TEXT);
textMessage.setCreateTime(new Date().getTime());
return MessageUtil.textMessage2XML(textMessage);
}
/**
* 主菜单字符串拼接
* @return
*/
public static String menuText() {
StringBuffer sb = new StringBuffer();
sb.append("欢迎您的关注,请按照菜单提示进行操作:\n\n");
sb.append("1.课程介绍\n\n");
sb.append("2.慕课网介绍\n\n");
sb.append("回复?调出子菜单");
return sb.toString();
}
/**
* 关键字1回复内容
* @return
*/
public static String firstMenu() {
StringBuffer sb = new StringBuffer();
sb.append("本套课程介绍微信公众号开发。");
return sb.toString();
}
/**
* 关键字2回复内容
* @return
*/
public static String secondMenu() {
StringBuffer sb = new StringBuffer();
sb.append("慕课网是一个网络IT教学网站。");
return sb.toString();
}
/**
* 关注回复
* @return
*/
public static String subscribeText() {
StringBuffer sb = new StringBuffer();
sb.append("欢迎关注此微信号。");
return sb.toString();
}
/**
* TODO 新增逻辑
* 将图文消息对象转成XML
* @param textMessage
* @return
*/
public static String newsMessage2XML(NewsMessage newsMessage) {
XStream xStream = new XStream();
xStream.alias("xml", newsMessage.getClass());
xStream.alias("item", new News().getClass());
return xStream.toXML(newsMessage);
}
/**
* 新增逻辑
* 图文消息的组装
* @param toUserName
* @param fromUserName
* @return
*/
public static String initNewsMessage(String toUserName , String fromUserName) {
String message = null;
NewsMessage newsMessage = new NewsMessage();
List<News> newsList = new ArrayList<News>();
News news1 = new News();
news1.setTitle("title1");
news1.setDescription("description1");
news1.setPicUrl("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png");
news1.setUrl("www.baidu.com");
newsList.add(news1);
newsMessage.setFromUserName(toUserName);
newsMessage.setToUserName(fromUserName);
newsMessage.setCreateTime(new Date().getTime());
newsMessage.setMsgType("news");
newsMessage.setArticles(newsList);
newsMessage.setArticleCount(newsList.size());
message = newsMessage2XML(newsMessage);
return message;
}
}
修改WeixinServlet用来测试图文消息
package com.imooc.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.imooc.po.TextMessage;
import com.imooc.util.CheckUtil;
import com.imooc.util.MessageUtil;
public class WeixinServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public WeixinServlet() {
super();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
PrintWriter out = response.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
out.print(echostr);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
try {
Map<String, String> map = MessageUtil.xml2Map(request);
String content = map.get(TextMessage.MESSAGE_Content);
String toUserName = map.get(TextMessage.MESSAGE_ToUserName);
String fromUserName = map.get(TextMessage.MESSAGE_FromUserName);
String msgType = map.get(TextMessage.MESSAGE_MsgType);
String message = null;
if(MessageUtil.MESSAGE_TEXT.equals(msgType)){
if("1".equals(content)){
message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.firstMenu());
} else if("2".equals(content)){
//TODO 修改此处用来测试图文消息回复
message = MessageUtil.initNewsMessage(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.subscribeText());
}
}
System.out.println(message);
out.write(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.close();
}
}
}
测试
在微信客户端输入2,出现图文消息。测试成功。