一、消息格式
1348831860 1234567890123456
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
二、编写消息类实体,代码如下:
BaseMessage.java ---基础消息类
package com.weixin.message;/** * 消息实体类 * @author Code猿猿 * */public class BaseMessage { /** * 开发者微信号 */ public String ToUserName; /** * 发送方帐号(一个OpenID) */ public String FromUserName; /** * 消息创建时间 (整型) */ public long CreateTime; /** * text */ public 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; } }
TextMessage.java ---文本消息
package com.weixin.message;/** * 文本消息 * @author Zhangsy * */public class TextMessage extends BaseMessage { /** * 文本消息内容 */ public String Content; /** * 消息id,64位整型 */ public long MsgId ; public String getContent() { return Content; } public void setContent(String content) { Content = content; } public long getMsgId() { return MsgId; } public void setMsgId(long msgId) { MsgId = msgId; } }
三、编写消息类(读取xml)
MessageUtil.java --》解析接收的xml信息、封装返回的xml信息
注意:这里用到了2个JAR包:xstream-1.3.jar、dom4j.jar
package com.weixin.util;import java.io.IOException;import java.io.InputStream;import java.io.Writer;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.regex.Pattern;import javax.servlet.http.HttpServletRequest;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.core.util.QuickWriter;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;import com.thoughtworks.xstream.io.xml.XppDriver;import com.weixin.message.TextMessage;/** * 对消息的处理 * @author Code猿猿 * */public class MessageUtil { /** * text */ public static final String RESP_MESSAGE_TYPE_TEXT = "text"; /** * music */ public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; /** * news */ public static final String RESP_MESSAGE_TYPE_NEWS = "news"; /** * text */ public static final String REQ_MESSAGE_TYPE_TEXT = "text"; /** * image */ public static final String REQ_MESSAGE_TYPE_IMAGE = "image"; /** * link */ public static final String REQ_MESSAGE_TYPE_LINK = "link"; /** * location */ public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; /** * voice */ public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; /** * video */ public static final String REQ_MESSAGE_TYPE_VIDEO = "video"; /** * shortvideo */ public static final String REQ_MESSAGE_TYPE_SHORTVIDEO = "shortvideo"; /** * event */ public static final String REQ_MESSAGE_TYPE_EVENT = "event"; /** * subscribe */ public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; /** * unsubscribe */ public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; /** * CLICK */ public static final String EVENT_TYPE_CLICK = "CLICK"; public static MapparseXml(HttpServletRequest request){ Map messageMap=new HashMap (); InputStream inputStream=null; try { //读取request Stream信息 inputStream=request.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } SAXReader reader = new SAXReader(); Document document=null; try { document = reader.read(inputStream); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } Element root=document.getRootElement(); List elementsList=root.elements(); for(Element e:elementsList){ messageMap.put(e.getName(),e.getText()); } try { inputStream.close(); inputStream=null; } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return messageMap; } /** * 转换文本消息 * * @param textMessage * * @return xml */ public static String textMessageToXml(TextMessage textMessage) { xstream.alias("xml", textMessage.getClass()); return xstream.toXML(textMessage); } /** * * 定义xstream让value自动加上CDATA标签 */ private static XStream xstream = new XStream(new XppDriver() { public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { boolean cdata = false; @SuppressWarnings("unchecked") public void startNode(String name, Class clazz) { if (!name.equals("xml")) { char[] arr = name.toCharArray(); if (arr[0] >= 'a' && arr[0] <= 'z') { // arr[0] -= 'a' - 'A'; arr[0] = (char) ((int) arr[0] - 32); } name = new String(arr); } super.startNode(name, clazz); } @Override public void setValue(String text) { if (text != null && !"".equals(text)) { Pattern patternInt = Pattern .compile("[0-9]*(\\.?)[0-9]*"); Pattern patternFloat = Pattern.compile("[0-9]+"); if (patternInt.matcher(text).matches() || patternFloat.matcher(text).matches()) { cdata = false; } else { cdata = true; } } super.setValue(text); } protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write(""); } else { writer.write(text); } } }; } }); }
四、修改Servlet中的Post方法,加入如下代码:
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); Mapmessage=MessageUtil.parseXml(request); String messageType=message.get("MsgType"); if(messageType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){ //接收的是文本消息 //打印接收所有参数 System.out.println("ToUserName:"+message.get("ToUserName")); System.out.println("FromUserName:"+message.get("FromUserName")); System.out.println("CreateTime:"+message.get("CreateTime")); System.out.println("MsgType:"+message.get("MsgType")); System.out.println("Content:"+message.get("Content")); System.out.println("MsgId:"+message.get("MsgId")); String req_content=message.get("Content"); String res_content=""; //组装回复消息 //我们做个小实验 //接收内容:你好 回复:你好 //接收内容:大家好 回复:大家好 //接收内容:同志们好 回复:为人民服务 if("你好".equals(req_content)){ res_content="你好"; }else if ("大家好".equals(req_content)){ res_content="大家好"; }else if("同志们好".equals(req_content)){ res_content="为人民服务"; }else{ //否则原样输出输入内容 res_content=req_content; } TextMessage textMessage=new TextMessage(); textMessage.setToUserName(message.get("FromUserName")); //这里的ToUserName 是刚才接收xml中的FromUserName textMessage.setFromUserName(message.get("ToUserName")); //这里的FromUserName 是刚才接收xml中的ToUserName 这里一定要注意,否则会出错 textMessage.setCreateTime(new Date().getTime()); textMessage.setContent(res_content); textMessage.setMsgType(messageType); String xml=MessageUtil.textMessageToXml(textMessage); System.out.println("xml:"+xml); PrintWriter out = response.getWriter(); out.print(xml); out.close(); }
五、部署测试
向公众号发送信息,看是否能够正常返回信息。
给各位推荐一个在线测试的平台:http://debug.fangbei.org/
操作步骤:
录入我们接入微信平台的URL和TOKEN
选择消息类型:文本
内容:输入要发送给公众号的内容
在右侧可看到效果的预览。