消息类型
- 文本消息(text)
- 图片消息(image)
- 语音消息(voice)
- 视频消息(vedio)
- 链接消息(link)
- 地理位置消息(location)
- 事件推送 (event)
7.1.关注(subscribe)
7.2.取消关注(unsubscribe)
7.3.菜单点击(CLICK,VIEW)
在MessageUtil新增逻辑
package com.imooc.util;
import java.io.InputStream;
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.TextMessage;
import com.thoughtworks.xstream.XStream;
public class MessageUtil {
/**
* TODO 新增消息常量
*/
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);
}
/**
* TODO 新增逻辑
* 文本消息回复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);
}
/**
* TODO 新增逻辑
* 主菜单字符串拼接
* @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();
}
/**
* TODO 新增逻辑
* 关键字1回复内容
* @return
*/
public static String firstMenu() {
StringBuffer sb = new StringBuffer();
sb.append("本套课程介绍微信公众号开发。");
return sb.toString();
}
/**
* TODO 新增逻辑
* 关键字2回复内容
* @return
*/
public static String secondMenu() {
StringBuffer sb = new StringBuffer();
sb.append("慕课网是一个网络IT教学网站。");
return sb.toString();
}
/**
* TODO 新增逻辑
* 关注回复
* @return
*/
public static String subscribeText() {
StringBuffer sb = new StringBuffer();
sb.append("欢迎关注此微信号。");
return sb.toString();
}
}
在WeixinServlet中新增逻辑
package com.imooc.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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)){
// TODO 新增逻辑 关键字回复
if("1".equals(content)){
message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.firstMenu());
} else if("2".equals(content)){
message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.secondMenu());
} else if("?".equals(content) || "?".equals(content)){
message = MessageUtil.initText(toUserName, fromUserName, MessageUtil.menuText());
}
} else if(MessageUtil.MESSAGE_EVENT.equals(msgType)){// TODO 新增关注事件逻辑
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) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
out.close();
}
}
}
测试
关注此微信号,微信客户端显示相应内容,关注测试成功。
在微信客户端分别输入1,2,?。客户端回复了相应内容。关键字回复成功。