接入微信公众平台的时候,微信将发送get请求给我们的校验方法。那当我们接收消息的时候,微信将向我们发送post请求,并以xml的格式发送与接收数据。
看一下微信发给我们的普通文本消息的xml包结构:
b2a0af5a8fd26276da50279a1c63a57a
ea5d8177d19f22584533e5c37c389942eae09a64d076f96f3228ae9470271e996671a89dce89e879d9e9c6d81d03862b
c5123754d1f4829fae4905e8abb602f9590cdcaa06dc33eb0992fff736103f4f42a4b8d57eb0afadcf16b7a02c69caaf
246311df1688542638dc52b54a1a4c871348831860e660f1169ff44ea75c5a982fcb1cde61
42815c2206ae835d7fd68cb4ae21e4dffa796850a1cf5d7bc01ca8cd7f8b83de698463fc03844fbe5a9caafaa1ebd0b1
ea63b4477034504a08070acf4e0b68b2e0728ade423af3f2536227a53ebc37ceaa91fa7c40b1cd973268e154dae1a50e
0d388664a03eec4d0f6697867adf11561234567890123456d62559defac6782605cccb28f6907157
21118965b89073f60271ef4a3b5d3c58
官方文档说明:
了解之后,开始敲代码:
1.将接收到的xml格式,转为集合对象(map)
在util包下,新建一个messageutil工具类:
将接收到的xml格式,转化为map格式需要一个叫dom4j的jar包。并将其放置在web-inf下的lib包中,在文章的末尾我会放上所需的所有jar包。借助dom4j的jar包,我们可以编写方法,将xml格式,转化对map对象格式,方法实现如下:
/** * 新建方法,将接收到的xml格式,转化为map对象 * @param request 将request对象,通过参数传入 * @return 返回转换后的map对象 */ public static map<string, string> xmltomap(httpservletrequest request) throws ioexception, documentexception{ map<string, string> map = new hashmap<string, string>(); //从dom4j的jar包中,拿到saxreader对象。 saxreader reader = new saxreader(); inputstream is = request.getinputstream();//从request中,获取输入流 document doc = reader.read(is);//从reader对象中,读取输入流 element root = doc.getrootelement();//获取xml文档的根元素 list<element> list = root.elements();//获得根元素下的所有子节点 for (element e : list) { map.put(e.getname(), e.gettext());//遍历list对象,并将结果保存到集合中 } is.close(); return map; }
2、 类似上述方法,我们需要编写方法,将我们的消息对象,转成xml。
此处,我们仍需借助一个jar包:xstream.jar,导入方式同dom4j。(另说明一点,之前我导入的xstream是1.4的版本,回复消息总是缺少内容,于是在各种尝试后将jar包版本换成1.3后回复消息成功,特此说明一下,具体原因暂时未知,将此坑告诉后面学习的人以防浪费时间)
当然,首先,我们需要新建一个实体类textmessage,用于承载消息对象,实体类中6个属性,分别对应上述微信给我们发送的xml文本的6个参数,并提供对应get/set方法以及空参/全参构造,此处不做赘述:
private string tousername;//开发者微信号private string fromusername;//发送方账号private long createtime;//消息创建时间private string msgtype;//消息类型private string content;//文本消息内容private string msgid;//消息id,64位整型
接下来,我们编写方法,来转换此文本消息类的对象,将其转换为xml格式返回:
/*** 将文本消息对象转化成xml格式* @param message 文本消息对象* @return 返回转换后的xml格式*/public static string textmessagetoxml(textmessage message){ xstream xs = new xstream(); //由于转换后xml根节点默认为class类,需转化为<xml> xs.alias("xml", message.getclass()); return xs.toxml(message);}
3、 写完上述两个处理方法后,我们来实现【消息的接收与响应】,
回到我们最开始的servlet中,在dopost方法中进行编写操作:
public void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { request.setcharacterencoding("utf-8"); response.setcharacterencoding("utf-8"); printwriter out = response.getwriter(); try { //将request请求,传到message工具类的转换方法中,返回接收到的map对象 map<string, string> map = messageutil.xmltomap(request); //从集合中,获取xml各个节点的内容 string tousername = map.get("tousername"); string fromusername = map.get("fromusername"); string createtime = map.get("createtime"); string msgtype = map.get("msgtype"); string content = map.get("content"); string msgid = map.get("msgid"); if(msgtype.equals("text")){//判断消息类型是否是文本消息(text) textmessage message = new textmessage(); //原来【接收消息用户】变为回复时【发送消息用户】 message.setfromusername(tousername); message.settousername(fromusername); message.setmsgtype("text"); message.setcreatetime(new date().gettime());//创建当前时间为消息时间 message.setcontent("您好,"+fromusername+"\n我是:"+tousername +"\n您发送的消息类型为:"+msgtype+"\n您发送的时间为"+createtime +"\n我回复的时间为:"+message.getcreatetime()+"\n您发送的内容是:"+content); //调用message工具类,将对象转为xml字符串 str = messageutil.textmessagetoxml(message); system.out.println(str); out.print(str); } } catch (documentexception e) { e.printstacktrace(); }finally{ out.close(); } } catch (documentexception e) { e.printstacktrace(); }finally{ out.close(); } }
这样,我们就成功的完成了文本消息的接收与响应。
项目所需jar包:
链接:https://pan.baidu.com/s/1n7wxodxn97awqpjgiyz5gw 密码:m5ne
相关推荐:
java实现微信公众平台开发的图文代码实例
微信公众号支付开发(java)实例详解
以上就是java+微信公众号开发过程步骤详解2的详细内容。
