《微信公众平台的Java的开发详解(工程代码+解析).pdf》由会员分享,可在线阅读,更多相关《微信公众平台的Java的开发详解(工程代码+解析).pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、微信公众平台的Java开发详解(工程代码+解析)说明:本次的教程主要是对 微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者尽快上手。在阅读本文之前,应对微信公众平台的官方开发文档有所了解,知道接收和发送的都是 xml 格式的数据。另外,在做内容回复时用到了 图灵机器人的 api 接口,这是一个 自然语言解析的开放平台,可以帮我们解决整个微信开发过程中最困难的问题,此处不多讲,下面会有其详细的调用方式。1.1 在登录微信官方平台之后,开启开发者模式,此时需要我们填写
2、url 和token,所谓 url 就是我们自己服务器的接口,用 WechatServlet.java来实现,相关解释已经在注释中说明,代码如下:javaview plaincopy1.package demo.servlet;2.3.import java.io.BufferedReader;4.import java.io.IOException;5.import java.io.InputStream;6.import java.io.InputStreamReader;7.import java.io.OutputStream;8.9.import javax.servlet.Serv
3、letException;10.import javax.servlet.http.HttpServlet;11.import javax.servlet.http.HttpServletRequest;12.import javax.servlet.http.HttpServletResponse;13.14.import demo.process.WechatProcess;15./*16.*微信服务端收发消息接口17.*18.*author pamchen-119.*20.*/21.publicclass WechatServlet extends HttpServlet 22.23./
4、*24.*The doGet method of the servlet.25.*26.*This method is called when a form has its tag value method equals to get.27.*28.*param request29.*the request send by the client to the server30.*param response31.*the response send by the server to the client32.*throws ServletException33.*if an error occ
5、urred34.*throws IOException35.*if an error occurred36.*/37.publicvoid doGet(HttpServletRequest request,HttpServletResponse response)38.throws ServletException,IOException 39.request.setCharacterEncoding(UTF-8);40.response.setCharacterEncoding(UTF-8);41.42./*读取接收到的xml 消息 */43.StringBuffer sb=new Stri
6、ngBuffer();44.InputStream is=request.getInputStream();45.InputStreamReader isr=new InputStreamReader(is,UTF-8);46.BufferedReader br=new BufferedReader(isr);47.String s=;48.while (s=br.readLine()!=null)49.sb.append(s);50.51.String xml=sb.toString();/次即为接收到微信端发送过来的xml 数据52.53.String result=;54./*判断是否是
7、微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回*/55.String echostr=request.getParameter(echostr);56.if (echostr!=null&echostr.length()1)57.result=echostr;58.else 59./正常的微信处理流程60.result=new WechatProcess().processWechatMag(xml);61.62.63.try 64.OutputStream os=response.getOutputStream();65.os.write(result.
8、getBytes(UTF-8);66.os.flush();67.os.close();68.catch (Exception e)69.e.printStackTrace();70.71.72.73./*74.*The doPost method of the servlet.75.*76.*This method is called when a form has its tag value method equals to77.*post.78.*79.*param request80.*the request send by the client to the server81.*pa
9、ram response82.*the response send by the server to the client83.*throws ServletException84.*if an error occurred85.*throws IOException86.*if an error occurred87.*/88.publicvoid doPost(HttpServletRequest request,HttpServletResponse response)89.throws ServletException,IOException 90.doGet(request,resp
10、onse);91.92.93.1.2 相应的 web.xml配置信息如下,在生成 WechatServlet.java的同时,可自动生成 web.xml中的配置。前面所提到的url 处可以填写例如:http;/服务器地址/项目名/wechat.dohtmlview plaincopy1.2.7.8.This is the description of my J2EE component9.This is the display name of my J2EE component10.WechatServlet11.demo.servlet.WechatServlet12.13.14.15.We
11、chatServlet16./wechat.do17.18.19.index.jsp20.21.1.3 通过以上代码,我们已经实现了微信公众平台开发的框架,即开通开发者模式并成功接入、接收消息和发送消息这三个步骤。下面就讲解其核心部分解析接收到的xml 数据,并以文本类消息为例,通过图灵机器人 api 接口实现智能回复。2.1 首先看一下整体流程处理代码,包括:xml 数据处理、调用图灵api、封装返回的 xml 数据。javaview plaincopy1.package demo.process;2.3.import java.util.Date;4.5.import demo.entit
12、y.ReceiveXmlEntity;6.7./*8.*微信 xml 消息处理流程逻辑类9.*author pamchen-110.*11.*/12.publicclass WechatProcess 13./*14.*解析处理 xml、获取智能回复结果(通过图灵机器人api接口)15.*param xml 接收到的微信数据16.*return 最终的解析结果(xml 格式数据)17.*/18.public String processWechatMag(String xml)19./*解析 xml 数据 */20.ReceiveXmlEntity xmlEntity=new ReceiveX
13、mlProcess().getMsgEntity(xml);21.22./*以文本消息为例,调用图灵机器人api 接口,获取回复内容*/23.String result=;24.if(text.endsWith(xmlEntity.getMsgType()25.result=new TulingApiProcess().getTulingResult(xmlEntity.getContent();26.27.28./*此时,如果用户输入的是“你好”,在经过上面的过程之后,result为“你也好”类似的内容29.*因为最终回复给微信的也是xml 格式的数据,所有需要将其封装为文本类型返回消息30
14、.*/31.result=new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(),xmlEntity.getToUserName(),result);32.33.return result;34.35.2.2 解析接收到的 xml 数据,此处有两个类,ReceiveXmlEntity.java和ReceiveXmlProcess.java,通过反射的机制动态调用实体类中的set 方法,可以避免很多重复的判断,提高代码效率,代码如下:javaview plaincopy1.package demo.entity;2./
15、*3.*接收到的微信xml 实体类4.*author pamchen-15.*6.*/7.publicclass ReceiveXmlEntity 8.private String ToUserName=;9.private String FromUserName=;10.private String CreateTime=;11.private String MsgType=;12.private String MsgId=;13.private String Event=;14.private String EventKey=;15.private String Ticket=;16.pr
16、ivate String Latitude=;17.private String Longitude=;18.private String Precision=;19.private String PicUrl=;20.private String MediaId=;21.private String Title=;22.private String Description=;23.private String Url=;24.private String Location_X=;25.private String Location_Y=;26.private String Scale=;27
17、.private String Label=;28.private String Content=;29.private String Format=;30.private String Recognition=;31.32.public String getRecognition()33.return Recognition;34.35.publicvoid setRecognition(String recognition)36.Recognition=recognition;37.38.public String getFormat()39.return Format;40.41.pub
18、licvoid setFormat(String format)42.Format=format;43.44.public String getContent()45.return Content;46.47.publicvoid setContent(String content)48.Content=content;49.50.public String getLocation_X()51.return Location_X;52.53.publicvoid setLocation_X(String locationX)54.Location_X=locationX;55.56.publi
19、c String getLocation_Y()57.return Location_Y;58.59.publicvoid setLocation_Y(String locationY)60.Location_Y=locationY;61.62.public String getScale()63.return Scale;64.65.publicvoid setScale(String scale)66.Scale=scale;67.68.public String getLabel()69.return Label;70.71.publicvoid setLabel(String labe
20、l)72.Label=label;73.74.public String getTitle()75.return Title;76.77.publicvoid setTitle(String title)78.Title=title;79.80.public String getDescription()81.return Description;82.83.publicvoid setDescription(String description)84.Description=description;85.86.public String getUrl()87.return Url;88.89
21、.publicvoid setUrl(String url)90.Url=url;91.92.public String getPicUrl()93.return PicUrl;94.95.publicvoid setPicUrl(String picUrl)96.PicUrl=picUrl;97.98.public String getMediaId()99.return MediaId;100.101.publicvoid setMediaId(String mediaId)102.MediaId=mediaId;103.104.public String getEventKey()105
22、.return EventKey;106.107.publicvoid setEventKey(String eventKey)108.EventKey=eventKey;109.110.public String getTicket()111.return Ticket;112.113.publicvoid setTicket(String ticket)114.Ticket=ticket;115.116.public String getLatitude()117.return Latitude;118.119.publicvoid setLatitude(String latitude)
23、120.Latitude=latitude;121.122.public String getLongitude()123.return Longitude;124.125.publicvoid setLongitude(String longitude)126.Longitude=longitude;127.128.public String getPrecision()129.return Precision;130.131.publicvoid setPrecision(String precision)132.Precision=precision;133.134.public Str
24、ing getEvent()135.return Event;136.137.publicvoid setEvent(String event)138.Event=event;139.140.public String getMsgId()141.return MsgId;142.143.publicvoid setMsgId(String msgId)144.MsgId=msgId;145.146.public String getToUserName()147.return ToUserName;148.149.publicvoid setToUserName(String toUserN
25、ame)150.ToUserName=toUserName;151.152.public String getFromUserName()153.return FromUserName;154.155.publicvoid setFromUserName(String fromUserName)156.FromUserName=fromUserName;157.158.public String getCreateTime()159.return CreateTime;160.161.publicvoid setCreateTime(String createTime)162.CreateTi
26、me=createTime;163.164.public String getMsgType()165.return MsgType;166.167.publicvoid setMsgType(String msgType)168.MsgType=msgType;169.170.javaview plaincopy1.package demo.process;2.3.import java.lang.reflect.Field;4.import java.lang.reflect.Method;5.import java.util.Iterator;6.import org.dom4j.Doc
27、ument;7.import org.dom4j.DocumentHelper;8.import org.dom4j.Element;9.10.import demo.entity.ReceiveXmlEntity;11./*12.*解析接收到的微信xml,返回消息对象13.*author pamchen-114.*15.*/16.publicclass ReceiveXmlProcess 17./*18.*解析微信 xml 消息19.*param strXml20.*return21.*/22.public ReceiveXmlEntity getMsgEntity(String strXm
28、l)23.ReceiveXmlEntity msg=null;24.try 25.if (strXml.length()=0|strXml=null)26.returnnull;27.28./将字符串转化为XML文档对象29.Document document=DocumentHelper.parseText(strXml);30./获得文档的根节点31.Element root=document.getRootElement();32./遍历根节点下所有子节点33.Iterator iter=root.elementIterator();34.35./遍历所有结点36.msg=new Rec
29、eiveXmlEntity();37./利用反射机制,调用set方法38./获取该实体的元类型39.Class c=Class.forName(demo.entity.ReceiveXmlEntity);40.msg=(ReceiveXmlEntity)c.newInstance();/创建这个实体的对象41.42.while(iter.hasNext()43.Element ele=(Element)iter.next();44./获取 set方法中的参数字段(实体类的属性)45.Field field=c.getDeclaredField(ele.getName();46./获取 set方
30、法,field.getType()获取它的参数数据类型47.Method method=c.getDeclaredMethod(set+ele.getName(),field.getType();48./调用 set方法49.method.invoke(msg,ele.getText();50.51.catch (Exception e)52./TODO:handle exception53.System.out.println(xml 格式异常:+strXml);54.e.printStackTrace();55.56.return msg;57.58.2.3 调用图灵机器人 api 接口,
31、获取智能回复内容:javaview plaincopy1.package demo.process;2.3.import java.io.IOException;4.import java.io.UnsupportedEncodingException;5.import .URLEncoder;6.7.import org.apache.http.HttpResponse;8.import org.apache.http.client.ClientProtocolException;9.import org.apache.http.client.methods.HttpGet;10.impor
32、t org.apache.http.impl.client.HttpClients;11.import org.apache.http.util.EntityUtils;12.import org.json.JSONException;13.import org.json.JSONObject;14.15./*16.*调用图灵机器人api 接口,获取智能回复内容17.*author pamchen-118.*19.*/20.publicclass TulingApiProcess 21./*22.*调用图灵机器人api接口,获取智能回复内容,解析获取自己所需结果23.*param conten
33、t24.*return25.*/26.public String getTulingResult(String content)27./*此处为图灵api接口,参数 key 需要自己去注册申请,先以 11111111 代替 */28.String apiUrl=http:/ param=;30.try 31.param=apiUrl+URLEncoder.encode(content,utf-8);32.catch (UnsupportedEncodingException e1)33./TODO Auto-generated catch block34.e1.printStackTrace(
34、);35./将参数转为url编码36.37./*发送 httpget请求 */38.HttpGet request=new HttpGet(param);39.String result=;40.try 41.HttpResponse response=HttpClients.createDefault().execute(request);42.if(response.getStatusLine().getStatusCode()=200)43.result=EntityUtils.toString(response.getEntity();44.45.catch (ClientProtoc
35、olException e)46.e.printStackTrace();47.catch (IOException e)48.e.printStackTrace();49.50./*请求失败处理 */51.if(null=result)52.return对不起,你说的话真是太高深了;53.54.55.try 56.JSONObject json=new JSONObject(result);57./以 code=100000为例,参考图灵机器人api文档58.if(100000=json.getInt(code)59.result=json.getString(text);60.61.cat
36、ch (JSONException e)62./TODO Auto-generated catch block63.e.printStackTrace();64.65.return result;66.67.2.4 将结果封装为微信规定的xml 格式,并返回给 1.1 中创建的 servlet接口。javaview plaincopy1.package demo.process;2.3.import java.util.Date;4./*5.*封装最终的xml 格式结果6.*author pamchen-17.*8.*/9.publicclass FormatXmlProcess 10./*1
37、1.*封装文字类的返回消息12.*param to13.*param from14.*param content15.*return16.*/17.public String formatXmlAnswer(String to,String from,String content)18.StringBuffer sb=new StringBuffer();19.Date date=new Date();20.sb.append();25.sb.append(date.getTime();26.sb.append(0);29.return sb.toString();30.31.总结,以上便是微信公众平台开发的全部流程,整体来看并不复杂,要非常感谢图灵机器人提供的api 接口,帮我们解决了智能回复这一高难度问题。其他类型的消息处理与示例中类似,有兴趣的开发者可以联系我进行交流学习,希望本文对大家有所帮助。