(微信公众号)如何接收和回复文本消息

来源:互联网 发布:步进电机驱动器编程 编辑:程序博客网 时间:2024/06/11 08:38

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 blocke.printStackTrace();} finally{out.close();}}

其中在工具类中

public static final String MESSAGE_TEXT="text";



阅读全文
0 0
原创粉丝点击