最近公司有需求,要做微信接口方面的开发,研究了一下它的实现原理,发现也挺简单的,下面带大家来了解下。
众所周知,微信号是要在联网的环境下才能够实现各种功能的,所以我们开发的后台的实现项目也需要在互联网能够访问的情况下进行,如果公司配备了外网连接的服务器,那是很好的,如果没有,现在网络上有很多云盘服务器也可以用,比如百度的bea,新浪的sea,阿里巴巴的等等,我搜索了一下,发现他们的注册申请好麻烦的,有的还可能现在已经需要支付费用了,所以用的是mopaas,突然之间找到的,免费使用的服务器空间也挺小的,只有512M,所以要开发真实个人项目的话,建议花点小钱去买一个,如果是企业的话,相信应该会有自己的外网服务器。其次是我们需要在为微信公众平台进行申请账号,提供了有个人订阅号,企业服务号,我申请的是一个个人订阅号,因为是免费的,但是里面很多操作都没有权限进行,比如自定义菜单等,企业号就可以啦,不过注册的时候需要提供企业的营业执照,还要交一定的费用,所以大家根据实际情况进行选择。环境必备好了,第一个是外网服务器,让我们的项目部署在上面,第二个是微信公众平台账号,下面就可以进入正题了:
首先应该是微信服务器与我们的服务器项目的URL地址建立连接,例如我在本地的eclipse中建立了一个web项目,名称为Weixin,其中我建立了一个WeixinServlet,那么这个Servlet就是处理我们服务器与微信服务器通讯的地址,到处war包部署在mopaas云服务器上面,通过浏览器能够访问到:http://外网服务器地址/Weixin/WeixinServlet,那么我们部署的项目就没问题了,关于如何部署项目到外网的服务器上,后面我再写博客详细描述,开通微信账号后,进入开发者模式,就会让我们输入一个URL地址,就是上面的我们项目工程与微信建立通讯的地址,包括处理的Servlet,http://外网服务器地址/Weixin/WeixinServlet,输入相关参数,进行确定,微信服务器会调用我们定义Servlet的doGet方法,为什么不是doPost方法,微信定义的,因为它定义第一次请求绑定是调用get方法,后面进行消息处理是调用post方法,携带相应的参数通过我们的服务器进行校验无误后,将成功的echostr字符串信息返回给我们的微信服务器,那么我们自己申请的微信平台和我们的Servlet就建立连接了,也就意味着这个地址已经成功绑定了,以后我们通过微信发送的信息,将会由微信服务器通过URL地址转到我们的服务器上的Servlet进行处理,图示如下:
好了,微信平台与我们的服务器通过绑定的URL建立连接了,以后的用户请求,例如用户通过微信客户端发送文本信息、图片信息、菜单事件,都将会交给我们的WeixinServlet的doPost方法进行处理,下面我们就来描述如何给微信服务器发送请求,自定义菜单,其实微信里面还有很多示例,需要我们自己去看微信平台的API了。
自定义菜单是需要有服务号才可以进行操作的,并且服务号必须通过了微信的认证,个人订阅号是没有相应权限的,所以这个需注意,自定义菜单挺简单的,因为微信API里面已经给我们做了详细的说明,只需要发送微信服务器的一个地址,然后携带相应的参数就可以了:
自定义菜单请求地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}
appid与secret:我们申请微信公众平台后会给我们的字符串信息,还有就是自定义菜单的json数据了
{ "button":[ { "type":"click", "name":"今日歌曲", "key":"V1001_TODAY_MUSIC" }, { "name":"菜单", "sub_button":[ { "type":"view", "name":"搜索", "url":"http://www.soso.com/" }, { "type":"view", "name":"视频", "url":"http://v.qq.com/" }, { "type":"click", "name":"赞一下我们", "key":"V1001_GOOD" }] }] }
通过post请求发送过去,那么微信服务器就会给我们的公众号实现自定义菜单了,这里说的自定义菜单是微信公众号内部干的事,所以跟我们上面定义的绑定地址的URL没关系,我们只需要发送一个微信服务器的请求地址就可以了,大家不要搞混淆了,当然在实际开发中,我们当然是通过代码去实现的,所以我在工程中新建了一个
SetWeixinMenuServlet,这个类的实现是调用微信服务器地址,进行post请求定义,成功返回微信服务器返回回来的成功信息,图示如下:
好了,接下来跟大家讲核心的东西了,当用户给微信公众号发送消息,文本消息、图片消息或者点击自定义菜单事件....的时候,那么微信服务器如何和我们的服务器进行通讯以及逻辑实现呢,还是上面说的,通过我们绑定的URL地址,当我们给公众号发送消息到微信服务器,微信服务器将我们的消息封装成为xml格式的数据,然后将信息提交到我们的服务器上定义处理类的一个post方法中,例如上面就是我们的WeixinServlet的doPost方法中,我们服务器需要做的就是解析微信服务器发送过来的XML格式的字符串,然后进行相应的逻辑处理后,转换为微信输出格式的xml字符串信息,然后通过HttpServletResponse返回给微信服务器,微信服务器再发送到我们的客户端做出响应。
微信中xml接收文本信息的格式,用户发送到微信服务器,微信服务器转换后发送给我们服务器的:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml>
微信中回复用户的xml文本信息格式,我们服务器做出逻辑处理后,封装发给微信服务器,再发给用户的:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[你好]]></Content> </xml>
其他的格式,请大家自己看微信公众平台API了解:http://mp.weixin.qq.com/wiki/home/index.html,图示如下:
下面是我从别人那里摘录过来的一张图,感觉描述的很好,基本上是微信的消息交互的实现原理了: