您的位置:首页 > 移动开发 > 微信开发

微信开发系列(五)_消息,事件的处理

2016-03-08 20:55 671 查看
来自微信端的事件可以有多种1:文本消息2:图片消息3:语音消息4:点击按钮事件5:扫码事件等等用户发送的消息或者事件  都是以xml的形式发送给我们开发者的(也就是服务器端) 我们也是以xml的格式返回去的这是开发者文档点击打开链接所有首先 我们得把用户的消息给获取并解析了(我给出一个工具类类  )可以看出就是把传过来的request直接传进去就ok了public static Map<String,String> xmlToMap(HttpServletRequest request) throws IOException, DocumentException{//用List列表的方式来解析xml,详细见http://www.jb51.net/article/42323.htmMap<String, String> map =new HashMap<String,String>(); //把客户端传过来的xml数据转换成map格式的数据SAXReader reader =new SAXReader();InputStream ins=request.getInputStream();//从request中获取输入流Document doc =reader.read(ins);// 弄成文本???XmlElement root =doc.getRootElement();List<Element> list =root.elements();//获取子节点元素//list相当于一个变量,List则是标明是何种变量,这样来理解for(Element e :list){map.put(e.getName(), e.getText()); //将遍历的结果保存到集合中}ins.close();return map;}然后当然就是获取map里面的数据了所以我们得根据他们的类型(是文字 还在图片 还是点击 ,,)Map<String ,String> map =BaseMessageUtil.xmlToMap(req); //把服务器传过来的xml格式的数据转换成mapString fromUserName =map.get("FromUserName");//发送方帐号(一个OpenID)String toUserName =map.get("ToUserName");//开发者微信号String msgType =map.get("MsgType");//textString content =map.get("Content");//文本消息内容请注意 图片的msgtype是image             文字的msgtype是text             语音的msgtype是voice             .....................但是事件的msgtype都是event (包括点击事件click 关注事件 扫码事件) 区分他们的唯一标示是 他们的map里面有一个event字段 可以将他们区分获取 String eventType = map.get("Event");   //事件的类型好了事件获取完毕就开始一一回击吧刚刚说过 回复也要包装成xml返回的所以制作完回复消息后就要转换成xml了再输出到微信端【out.print(message);】消息的制作就以图文消息为例首先新建一个基本消息父类package com.po;public class BaseMessage {private String ToUserName;//微信号private String FromUserName;//用户的openIDprivate 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;}}图文消息类一个总图文(PicNews)消息里面可以包含多个图文消息(PicNewsMessage)package com.po;public class PicNews {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;}}
package com.po;import java.util.List;public class PicNewsMessage extends BaseMessage{    //图文消息的基本设置private int ArticleCount;private List<PicNews> Articles;//该集合中存放的是PicNews对象,每个对象都代表着一条图文消息public int getArticleCount() {return ArticleCount;}public void setArticleCount(int articleCount) {ArticleCount = articleCount;}public List<PicNews> getArticles() {return Articles;}public void setArticles(List<PicNews> articles) {Articles = articles;}}
返回的时候只要填写数据就ok了
填写好了之后就要把PicNewsMessage 对象转化成xml了
话不多说  转化的代码(这是图文消息的转化)
<pre name="code" class="java">
 public static String PicNewsMessageToXml(PicNewsMessage picNewsMessage){ //返回一个Xml XStream xstream = new XStream(); xstrea4000m.alias("xml", picNewsMessage.getClass()); xstream.alias("item", new PicNews().getClass());//<articles>下根为<items> return xstream.toXML(picNewsMessage);}
把转化完的消息放在message中out一下就到微信端了
再把微信servlet代码贴上去
<pre name="code" class="java">package com.servlet;import java.io.IOException;import java.io.PrintWriter;import java.sql.SQLException;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 org.dom4j.DocumentException;import com.po.TextMessage;import com.util.CheckUtil;import com.util.BaseMessageUtil;import com.util.ImageMessageUtil;import com.util.MusicMessageUtil;import com.util.PicNewsMessageUtil;import com.util.TextMessageUtil;import com.util.WeixinUtil;import com.xt.util.UserUtil;public class WeixinServlet extends HttpServlet {/****/private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {  //验证方式为getString signature = req.getParameter("signature");String timestamp = req.getParameter("timestamp");String nonce = req.getParameter("nonce");String echostr = req.getParameter("echostr");PrintWriter out = resp.getWriter();if(CheckUtil.checkSignature(signature, timestamp, nonce)){out.print(echostr);}}protected void doPost(HttpServletRequest req ,HttpServletResponse resp) throws IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");/*** out是输出字符流,即servlet接受到request请求后,* servlet使用out来返回结果,不管客户端是什么(浏览器或者httpclient 或者别的serlvet等等),* 它都和客户端建立一个流输出管道,然后把字符流输出给请求端。*/PrintWriter out =resp.getWriter();try {Map<String ,String> map =BaseMessageUtil.xmlToMap(req);  //把服务器传过来的xml格式的数据转换成mapString fromUserName =map.get("FromUserName");//发送方帐号(一个OpenID)String toUserName =map.get("ToUserName");//开发者微信号String msgType =map.get("MsgType");//textString content =map.get("Content");//文本消息内容//String//判断该消息是否为文本消息String message =null;if(BaseMessageUtil.MESSAGE_TEXT.equals(msgType)){  //发过来的时文本消息时if("1".equals(content)){  //回复文本消息System.out.println(this+"用户输入的是1");//					message = TextMessageUtil.initText(toUserName, fromUserName, TextMessageUtil.firstMenu(fromUserName));message = PicNewsMessageUtil.initPicNewsMessage(toUserName, fromUserName,12);}else if("2".equals(content)){  //回复图文消息//message = PicNewsMessageUtil.initPicNewsMessage(toUserName, fromUserName);}else if("3".equals(content)){  //回复图片消息message = ImageMessageUtil.initImageMessage(toUserName, fromUserName);}else if("4".equals(content)){  //回复音乐消息message = MusicMessageUtil.initMusicMessage(toUserName, fromUserName);}else if("5".equals(content)){  //回复文本消息message = TextMessageUtil.initText(toUserName, fromUserName,TextMessageUtil.threeMenu());}else if("?".equals(content)||"?".equals(content)){ //菜单message = TextMessageUtil.initText(toUserName, fromUserName, TextMessageUtil.menuText(fromUserName));}else if(content.startsWith("翻译")){String word = content.replaceAll("^翻译", "").trim();if("".equals(word)){message = TextMessageUtil.initText(toUserName, fromUserName,TextMessageUtil.threeMenu());}else{//message = TextMessageUtil.initText(toUserName, fromUserName, WeixinUtil.translate(word));//翻译}}/**text.setFromUserName(toUserName);text.setToUserName(fromUserName);text.setMsgType("text");text.setCreateTime(new Date().getTime());text.setContent("您发送的消息是:"+content);TextMessage text =new TextMessage();message = TextMessageUtil.textMessageToXml(text);*/}else if(BaseMessageUtil.MESSAGE_EVENT.equals(msgType)){  //当发过来的是事件String eventType = map.get("Event");   //点击事件的类型if(BaseMessageUtil.MESSAGE_SUBSCRIBE.equals(eventType)){  //调出主菜单message = TextMessageUtil.initText(toUserName, fromUserName, TextMessageUtil.menuText(fromUserName));UserUtil userUtil=new UserUtil();try {userUtil.saveUser(fromUserName);//关注的时候往数据库里面插入用户的信息} catch (ClassNotFoundException | SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else if(BaseMessageUtil.MESSAGE_CLICK.equals(eventType)){  //点击事件时,推送图文消息int Key = Integer.parseInt(map.get("EventKey"));  //得到按钮的key值message = PicNewsMessageUtil.initPicNewsMessage(toUserName, fromUserName,Key);}else if(BaseMessageUtil.MESSAGE_VIEW.equals(eventType)){  //链接事件System.out.println("你点击了ViewButton");message = TextMessageUtil.initText(toUserName, fromUserName, TextMessageUtil.menuText(fromUserName));//					String url = map.get("EventKey");//					message = TextMessageUtil.initText(toUserName, fromUserName, url);}else if(BaseMessageUtil.MESSAGE_SCANCODE.equals(eventType)){  //扫码事件,推送消息String key =map.get("EventKey");System.out.println(key);//message = TextMessageUtil.initText(toUserName, fromUserName, key);}else if(BaseMessageUtil.MESSAGE_LOCATION.equals(eventType)){String label = map.get("Label");message = TextMessageUtil.initText(toUserName, fromUserName, label);}else if(BaseMessageUtil.MESSAGE_SCAN.equals(eventType)){String scene_id = map.get("EventKey");System.out.println(scene_id);}}//System.out.println(message);out.print(message);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{out.close();}}}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: