微信公众号开发--回复
import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import javax.servlet.http.HttpServletRequest; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 消息处理工具类 */ public class MessageHandlerUtil { /** * 解析微信发来的请求(XML) * @param request * @return map * @throws Exception */ public static Map<String,String> parseXml(HttpServletRequest request) throws Exception { // 将解析结果存储在HashMap中 Map<String,String> map = new HashMap(); // 从request中取得输入流 InputStream inputStream = request.getInputStream(); System.out.println("获取输入流"); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List<Element> elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) { System.out.println(e.getName() + "|" + e.getText()); map.put(e.getName(), e.getText()); } // 释放资源 inputStream.close(); inputStream = null; return map; } /** * 构造文本消息 * * @param map * @param content * @return */ private static String buildTextMessage(Map<String,String> map, String content) { //发送方帐号 String fromUserName = map.get("FromUserName"); // 开发者微信号 String toUserName = map.get("ToUserName"); /** * 文本消息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位整型 */ return String.format( "<xml>" + "<ToUserName><![CDATA[%s]]></ToUserName>" + "<FromUserName><![CDATA[%s]]></FromUserName>" + "<CreateTime>%s</CreateTime>" + "<MsgType><![CDATA[text]]></MsgType>" + "<Content><![CDATA[%s]]></Content>" + "</xml>", fromUserName, toUserName, getUtcTime(), content); } /** * 构造图片消息 * @param map 封装了解析结果的Map * @param mediaId 通过素材管理接口上传多媒体文件得到的id * @return 图片消息XML字符串 */ private static String buildImageMessage(Map<String, String> map, String mediaId) { //发送方帐号 String fromUserName = map.get("FromUserName"); // 开发者微信号 String toUserName = map.get("ToUserName"); /** * 图片消息XML数据格式 *<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[media_id]]></MediaId> </Image> </xml> */ return String.format( "<xml>" + "<ToUserName><![CDATA[%s]]></ToUserName>" + "<FromUserName><![CDATA[%s]]></FromUserName>" + "<CreateTime>%s</CreateTime>" + "<MsgType><![CDATA[image]]></MsgType>" + "<Image>" + " <MediaId><![CDATA[%s]]></MediaId>" + "</Image>" + "</xml>", fromUserName, toUserName, getUtcTime(), mediaId); } private static String getUtcTime() { Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间 DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 设置显示格式 String nowTime = df.format(dt); long dd = (long) 0; try { dd = df.parse(nowTime).getTime(); } catch (Exception e) { } return String.valueOf(dd); } /** * 接收到的消息类型 */ public enum MessageType { TEXT,//文本消息 IMAGE,//图片消息 VOICE,//语音消息 VIDEO,//视频消息 SHORTVIDEO,//小视频消息 LOCATION,//地理位置消息 LINK,//链接消息 EVENT//事件消息 } /** * 根据消息类型构造返回消息 * @param map 封装了解析结果的Map * @return responseMessage(响应消息) */ public static String buildResponseMessage(Map map, String content) { //响应消息 String responseMessage = ""; //得到消息类型 String msgType = map.get("MsgType").toString(); System.out.println("MsgType:" + msgType); //消息类型 MessageType messageEnumType = MessageType.valueOf(MessageType.class, msgType.toUpperCase()); switch (messageEnumType) { case TEXT: //处理文本消息 responseMessage = buildTextMessage(map,content); //responseMessage = buildImageMessage(map,"yQ0OruBARrDELEVjOqT4Yp_YSsCAbcUcmtIGMaX6-nv8kMF6DuanhlEKqZUMj0G0"); break; case IMAGE: //处理图片消息 responseMessage = buildImageMessage(map,"yQ0OruBARrDELEVjOqT4Yp_YSsCAbcUcmtIGMaX6-nv8kMF6DuanhlEKqZUMj0G0"); break; case VOICE: //处理语音消息 // responseMessage = handleVoiceMessage(map); break; case VIDEO: //处理视频消息 //responseMessage = handleVideoMessage(map); break; case SHORTVIDEO: //处理小视频消息 //responseMessage = handleSmallVideoMessage(map); break; case LOCATION: //处理位置消息 //responseMessage = handleLocationMessage(map); break; case LINK: //处理链接消息 //responseMessage = handleLinkMessage(map); break; case EVENT: //处理事件消息,用户在关注与取消关注公众号时,微信会向我们的公众号服务器发送事件消息,开发者接收到事件消息后就可以给用户下发欢迎消息 //responseMessage = handleEventMessage(map); default: break; } //返回响应消息 return responseMessage; } }
解析 构造回复 工具类
在接入微信公众号的时候get 为验证签名,post会发送消息,回第一个随笔里找wxbase类