如何用java开发微信

 我来答
匿名用户
2018-01-06
展开全部

说明:
本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者尽快上手。

在阅读本文之前,应对微信公众平台的官方开发文档有所了解,知道接收和发送的都是xml格式的数据。另外,在做内容回复时用到了图灵机器人的api接口,这是一个自然语言解析的开放平台,可以帮我们解决整个微信开发过程中最困难的问题,此处不多讲,下面会有其详细的调用方式。


1.1 在登录微信官方平台之后,开启开发者模式,此时需要我们填写url和token,所谓url就是我们自己服务器的接口,用WechatServlet.java来实现,相关解释已经在注释中说明,代码如下:

[java] view plain copy

  • package demo.servlet;  

  • import java.io.BufferedReader;  

  • import java.io.IOException;  

  • import java.io.InputStream;  

  • import java.io.InputStreamReader;  

  • import java.io.OutputStream;  

  • import javax.servlet.ServletException;  

  • import javax.servlet.http.HttpServlet;  

  • import javax.servlet.http.HttpServletRequest;  

  • import javax.servlet.http.HttpServletResponse;  

  • import demo.process.WechatProcess;  

  • /** 

  • * 微信服务端收发消息接口 

  • *  

  • * @author pamchen-1 

  • *  

  • */  

  • public class WechatServlet extends HttpServlet {  

  • /** 

  • * The doGet method of the servlet. <br> 

  • *  

  • * This method is called when a form has its tag value method equals to get. 

  • *  

  • * @param request 

  • *            the request send by the client to the server 

  • * @param response 

  • *            the response send by the server to the client 

  • * @throws ServletException 

  • *             if an error occurred 

  • * @throws IOException 

  • *             if an error occurred 

  • */  

  • public void doGet(HttpServletRequest request, HttpServletResponse response)  

  • throws ServletException, IOException {  

  • request.setCharacterEncoding("UTF-8");  

  • response.setCharacterEncoding("UTF-8");  

  • /** 读取接收到的xml消息 */  

  • StringBuffer sb = new StringBuffer();  

  • InputStream is = request.getInputStream();  

  • InputStreamReader isr = new InputStreamReader(is, "UTF-8");  

  • BufferedReader br = new BufferedReader(isr);  

  • String s = "";  

  • while ((s = br.readLine()) != null) {  

  • sb.append(s);  

  • }  

  • String xml = sb.toString(); //次即为接收到微信端发送过来的xml数据  

  • String result = "";  

  • /** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */  

  • String echostr = request.getParameter("echostr");  

  • if (echostr != null && echostr.length() > 1) {  

  • result = echostr;  

  • } else {  

  • //正常的微信处理流程  

  • result = new WechatProcess().processWechatMag(xml);  

  • }  

  • try {  

  • OutputStream os = response.getOutputStream();  

  • os.write(result.getBytes("UTF-8"));  

  • os.flush();  

  • os.close();  

  • } catch (Exception e) {  

  • e.printStackTrace();  

  • }  

  • }  

  • /** 

  • * The doPost method of the servlet. <br> 

  • *  

  • * This method is called when a form has its tag value method equals to 

  • * post. 

  • *  

  • * @param request 

  • *            the request send by the client to the server 

  • * @param response 

  • *            the response send by the server to the client 

  • * @throws ServletException 

  • *             if an error occurred 

  • * @throws IOException 

  • *             if an error occurred 

  • */  

  • public void doPost(HttpServletRequest request, HttpServletResponse response)  

  • throws ServletException, IOException {  

  • doGet(request, response);  

  • }  

  • }  

  • 1.2 相应的web.xml配置信息如下,在生成WechatServlet.java的同时,可自动生成web.xml中的配置。前面所提到的url处可以填写例如:http;//服务器地址/项目名/wechat.do

    [html] view plain copy

  • <?xml version="1.0" encoding="UTF-8"?>  

  • <web-app version="2.5"   

  • xmlns="http://java.sun.com/xml/ns/javaee"   

  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

  • xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   

  • http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  

  • <servlet>  

  • <description>This is the description of my J2EE component</description>  

  • <display-name>This is the display name of my J2EE component</display-name>  

  • <servlet-name>WechatServlet</servlet-name>  

  • <servlet-class>demo.servlet.WechatServlet</servlet-class>  

  • </servlet>  

  • <servlet-mapping>  

  • <servlet-name>WechatServlet</servlet-name>  

  • <url-pattern>/wechat.do</url-pattern>  

  • </servlet-mapping>  

  • <welcome-file-list>  

  • <welcome-file>index.jsp</welcome-file>  

  • </welcome-file-list>  

  • </web-app>  

  • 1.3 通过以上代码,我们已经实现了微信公众平台开发的框架,即开通开发者模式并成功接入、接收消息和发送消息这三个步骤。


    下面就讲解其核心部分——解析接收到的xml数据,并以文本类消息为例,通过图灵机器人api接口实现智能回复。


    2.1 首先看一下整体流程处理代码,包括:xml数据处理、调用图灵api、封装返回的xml数据。

    [java] view plain copy

  • package demo.process;  

  • import java.util.Date;  

  • import demo.entity.ReceiveXmlEntity;  

  • /** 

  • * 微信xml消息处理流程逻辑类 

  • * @author pamchen-1 

  • */  

  • public class WechatProcess {  

  • /** 

  • * 解析处理xml、获取智能回复结果(通过图灵机器人api接口) 

  • * @param xml 接收到的微信数据 

  • * @return  最终的解析结果(xml格式数据) 

  • */  

  • public String processWechatMag(String xml){  

  • /** 解析xml数据 */  

  • ReceiveXmlEntity xmlEntity = new ReceiveXmlProcess().getMsgEntity(xml);  

  • /** 以文本消息为例,调用图灵机器人api接口,获取回复内容 */  

  • String result = "";  

  • if("text".endsWith(xmlEntity.getMsgType())){  

  • result = new TulingApiProcess().getTulingResult(xmlEntity.getContent());  

  • }  

  • /** 此时,如果用户输入的是“你好”,在经过上面的过程之后,result为“你也好”类似的内容  

  • *  因为最终回复给微信的也是xml格式的数据,所有需要将其封装为文本类型返回消息 

  • * */  

  • result = new FormatXmlProcess().formatXmlAnswer(xmlEntity.getFromUserName(), xmlEntity.getToUserName(), result);  

  • return result;  

  • }  

  • }  

  • 2.2 解析接收到的xml数据,此处有两个类,ReceiveXmlEntity.java和ReceiveXmlProcess.java,通过反射的机制动态调用实体类中的set方法,可以避免很多重复的判断,提高代码效率,代码如下:

    [java] view plain copy

  • package demo.entity;  

  • /** 

  • * 接收到的微信xml实体类 

  • * @author pamchen-1 

  • */  

  • public class ReceiveXmlEntity {  

  • private String ToUserName="";  

  • private String FromUserName="";  

  • private String CreateTime="";  

  • private String MsgType="";  

  • private String MsgId="";  

  • private String Event="";  

  • private String EventKey="";  

  • private String Ticket="";  

  • private String Latitude="";  

  • private String Longitude="";  

  • private String Precision="";  

  • private String PicUrl="";  

  • private String MediaId="";  

  • private String Title="";  

  • private String Description="";  

  • private String Url="";  

  • private String Location_X="";  

  • private String Location_Y="";  

  • private String Scale="";  

  • private String Label="";  

  • private String Content="";  

  • private String Format="";  

  • private String Recognition="";  

  • public String getRecognition() {  

  • return Recognition;  

  • }  

  • public void setRecognition(String recognition) {  

  • Recognition = recognition;  

  • }  

  • public String getFormat() {  

  • return Format;  

  • }  

  • public void setFormat(String format) {  

  • Format = format;  

  • }  

  • public String getContent() {  

  • return Content;  

  • }  

  • public void setContent(String content) {  

  • Content = content;  

  • }  

  • public String getLocation_X() {  

  • return Location_X;  

  • }  

  • public void setLocation_X(String locationX) {  

  • Location_X = locationX;  

  • }  

  • public String getLocation_Y() {  

  • return Location_Y;  

  • }  

  • public void setLocation_Y(String locationY) {  

  • Location_Y = locationY;  

  • }  

  • public String getScale() {  

  • return Scale;  

  • }  

  • public void setScale(String scale) {  

  • Scale = scale;  

  • }  

  • public String getLabel() {  

  • return Label;  

  • }  

  • public void setLabel(String label) {  

  • Label = label;  

  • }  

  • 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 getUrl() {  

  • return Url;  

  • }  

  • public void setUrl(String url) {  

  • Url = url;  

  • }  

  • public String getPicUrl() {  

  • return PicUrl;  

  • }  

  • public void setPicUrl(String picUrl) {  

  • PicUrl = picUrl;  

  • }  

  • public String getMediaId() {  

  • return MediaId;  

  • }  

  • public void setMediaId(String mediaId) {  

  • MediaId = mediaId;  

  • }  

  • public String getEventKey() {  

  • return EventKey;  

  • }  

  • public void setEventKey(String eventKey) {  

  • EventKey = eventKey;  

  • }  

  • public String getTicket() {  

  • return Ticket;  

  • }  

  • public void setTicket(String ticket) {  

  • Ticket = ticket;  

  • }  

  • public String getLatitude() {  

  • return Latitude;  

  • }  

  • public void setLatitude(String latitude) {  

  • Latitude = latitude;  

  • }  

  • public String getLongitude() {  

  • return Longitude;  

  • }  

  • public void setLongitude(String longitude) {  

  • Longitude = longitude;  

  • }  

  • public String getPrecision() {  

  • return Precision;  

  • }  

  • public void setPrecision(String precision) {  

  • Precision = precision;  

  • }  

  • public String getEvent() {  

  • return Event;  

  • }  

  • public void setEvent(String event) {  

  • Event = event;  

  • }  

  • public String getMsgId() {  

  • return MsgId;  

  • }  

  • public void setMsgId(String msgId) {  

  • MsgId = msgId;  

  • }  

  • public String getToUserName() {  

  • return ToUserName;  

  • }  

  • public void setToUserName(String toUserName) {  

上海里艾
2024-10-28 广告
里艾传播,是基于受众洞察,整合多种营销方式,聚焦社交网络及搜索引擎,协助品牌和产品扩大其社会影响力的新形态传播公司。从品牌渠道招商、新品发布造势、电商节日大促等方面为合作品牌搭建一站式内容传播服务,从而满足品牌在不同阶段的营销需求,致力于成... 点击进入详情页
本回答由上海里艾提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式