微信开发二三事:走进微信

来源:互联网 发布:淘宝足球鞋便宜 编辑:程序博客网 时间:2024/04/29 12:23

上一篇说到已经成功成为开发者了,所以,现在想干嘛就干嘛,开发者嘛,程序猿,都是有很强的控制欲的~~

当初成为开发者后,就在看那个微信公众平台的开发者文档,看接收信息和发送信息,发现其实都是xml格式的,根节点都是<xml>,其后就是一些个属性,比如

FromUserName、ToUserName....,那我们去解析微信发过来的xml的话,就能得到我们想要的数据了(注:这是文本信息的数据ToUserName、FromUserName、

CreateTime、MsgType、Conten、MsgId)。其中的CreateTime是指1970年1月1号0时0分0秒到消息发送的时候经历了多少秒,我们所应该注意的,是ToUserName、

FromUserName、MsgType和Conten,因为如果我们得到这四个值,就能发送信息给微信用户了。

OK,那我们先来看看如何去解析微信发过来的xml。通过查看文档,我们知道,微信服务器是通过POST请求,把消息的XML数据包到开发者填写的URL上,so,我们就可以

根据servlet中的dopost方法去获取,方法如下:

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");PrintWriter out = response.getWriter();InputStream is = request.getInputStream();try {PushManage push = new PushManage();String getXml = push.PushManageXml(is);out.print(getXml);} catch (JDOMException e) {out.print("请求失败!");}}
因为我们是用jdom去解析的,所以是获取io流去解析的,PushManager是我创建的解析的一个类,代码如下:

/** * 微信所有接口入口 *  * @author tane  */public class PushManage {/** * Logger for this class */private static final Logger logger = Logger.getLogger(PushManage.class);private TypeInfoBiz typeInfoBiz=new TypeInfoBizImpl();private CreateXmlUtil createXmlUtil=new CreateXmlUtil();public String PushManageXml(InputStream is) throws JDOMException {String returnStr = "";String toName = "";String FromName = "";String type = "";String content = "";//回送文本信息内容String con = "";//接收文本信息内容String picUrl = "";//回送图片链接String pic = "";//接收图片链接String mediaId = "";//图片消息媒体idString event = "";// 自定义按钮事件请求String eKey = "";// 事件请求key值String format="";//音乐的语音格式String location_X="";//地理位置维度String location_Y="";//地理位置经度String scale="";//地图缩放大小String label="";//地理位置信息String url="";//图文信息回复的图片地址String ss="";//图文信息回复的文章地址String linkTitle="";//链接标题String linkDescription="";//链接描述String linkUrl="";//链接地址String Recognition="";//语音识别结果try {SAXBuilder sax = new SAXBuilder();<span style="white-space:pre"></span>//注意,用的是jdom解析Document doc = sax.build(is);// 获得文件的根元素Element root = doc.getRootElement();// 获得根元素的第一级子节点List list = root.getChildren();for (int j = 0; j < list.size(); j++) {// 获得结点Element first = (Element) list.get(j);if (first.getName().equals("ToUserName")) {toName = first.getValue().trim();} else if (first.getName().equals("FromUserName")) {FromName = first.getValue().trim();} else if (first.getName().equals("MsgType")) {type = first.getValue().trim();} else if (first.getName().equals("Content")) {con = first.getValue().trim();} else if (first.getName().equals("PicUrl")){pic = first.getValue().trim();} else if (first.getName().equals("MediaId")){mediaId = first.getValue().trim();} else if (first.getName().equals("Event")) {event = first.getValue().trim();} else if (first.getName().equals("EventKey")) {eKey = first.getValue().trim();} else if (first.getName().equals("Format")){format = first.getValue().trim();} else if (first.getName().equals("Location_X")){location_X = first.getValue().trim();} else if (first.getName().equals("Location_Y")){location_Y = first.getValue().trim();} else if (first.getName().equals("Scale")){scale = first.getValue().trim();} else if (first.getName().equals("Label")){label = first.getValue().trim();} else if (first.getName().equals("Title")){linkTitle = first.getValue().trim();} else if (first.getName().equals("Description")){linkDescription = first.getValue().trim();} else if (first.getName().equals("Url")){linkUrl = first.getValue().trim();} else if (first.getName().equals("Recognition")){Recognition = first.getValue().trim();} }} catch (IOException e) {e.printStackTrace();}if (type.equals("event")) {//关注我if (event.equals("subscribe")) {//表示单纯的关注if(eKey==null||"".equals(eKey)){returnStr = "欢迎关注我~~";}}} else if (type.equals("text")) {//文本信息returnStr = typeInfoBiz.TypeOfText(toName, FromName, con,type);//普通文本信息回复} else if (type.equals("image")) {//图片信息信息content="图片链接为:"+pic+"\n图片ID为:"+mediaId;returnStr = typeInfoBiz.TypeOfText(toName, FromName, content,type);} else if(type.equals("voice")){returnStr = typeInfoBiz.TypeOfText(toName, FromName, Recognition,type);<span style="white-space:pre"></span>//把语音识别的结果传过去} else if(type.equals("location")){content="地理纬度是:\n"+location_X+"\n"+"地理经度是:\n"+location_Y+"\n"+"地图缩放大小是:"+scale+"\n"+"地理位置信息"+label;returnStr = typeInfoBiz.TypeOfText(toName, FromName, content,type);} else if(type.equals("link")){content="链接标题是:\n"+linkTitle+"\n"+"链接内容是:\n"+linkDescription+"\n"+"链接地址是:\n"+linkUrl;returnStr = typeInfoBiz.TypeOfText(toName, FromName, content,type);}return returnStr;}
然后在typeInfoBiz里面去判断类型,根据类型或者内容去返回信息,如下:

package com.tane.biz;/** *  * @author tane */public interface TypeInfoBiz {/** * 回复文本信息,这里的content都是从数据库里面查出 * @param toName * @param FromName * @param content   用户传过来的内容 * @param type    消息类别 * @return */public String TypeOfText(String toName,String FromName,String content,String type);}
/** * @author tane * */public class TypeInfoBizImpl extends DBHelper implements TypeInfoBiz {private CreateXmlUtil createXmlUtil=new CreateXmlUtil();/*创建回复信息的帮助类*/private String returnStr="";/** * 回复文本 */public String TypeOfText(String toName, String FromName, String content, String type) {<span style="white-space:pre"></span>if("text".equals(type)){<span style="white-space:pre"></span>//这里之所以做判断,是为以后区分信息做准备returnStr=createXmlUtil.getBackXMLTypeText(toName, FromName, content);}else if("voice".equals(type)){returnStr=createXmlUtil.getBackXMLTypeText(toName, FromName, content);}else if("image".equals(type)){returnStr=createXmlUtil.getBackXMLTypeText(toName, FromName, content);}else{returnStr=createXmlUtil.getBackXMLTypeText(toName, FromName, content);}return returnStr;}}
CreateXMLUtil是用来创建xml的,其中包括很多种类型,比如文本信息、音乐、图文等等,我这里只列出文本信息

public class CreateXmlUtil {/** * 文本信息回复 *  * @param toName * @param FromName * @param content * @return */public String getBackXMLTypeText(String toName, String FromName,String content) {String returnStr = "";SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");String times = format.format(new Date());Element rootXML = new Element("xml");rootXML.addContent(new Element("ToUserName").setText(FromName));rootXML.addContent(new Element("FromUserName").setText(toName));rootXML.addContent(new Element("CreateTime").setText(times));rootXML.addContent(new Element("MsgType").setText("text"));rootXML.addContent(new Element("Content").setText(content));Document doc = new Document(rootXML);XMLOutputter XMLOut = new XMLOutputter();returnStr = XMLOut.outputString(doc);return returnStr;}

ok,至此,文本信息的接收和返回已经写完,但这也只是文本信息,还有其他的音乐、图文、图片等可以接收和返回,我这里也只是列出文本信息,希望大家可以根据文本信息,自己写出其他类型的信息接收和发送,明天我们来讲讲自定义菜单的使用




0 0