微信公众号开发实现原理

最近公司有需求,要做微信接口方面的开发,研究了一下它的实现原理,发现也挺简单的,下面带大家来了解下。

众所周知,微信号是要在联网的环境下才能够实现各种功能的,所以我们开发的后台的实现项目也需要在互联网能够访问的情况下进行,如果公司配备了外网连接的服务器,那是很好的,如果没有,现在网络上有很多云盘服务器也可以用,比如百度的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,图示如下:

下面是我从别人那里摘录过来的一张图,感觉描述的很好,基本上是微信的消息交互的实现原理了:

好了,下面的博客中,会陆续更新微信实现的各个方面的细节,与大家一起分享,欢迎喜欢从事微信平台开发的一起交流分享!

时间: 2024-10-16 09:19:41

微信公众号开发实现原理的相关文章

C#微信公众号开发系列教程二(新手接入指南)

http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微

微信公众号开发入门笔记(四):开发环境搭建

(一)Eclipse+Tomcat本地服务器的搭建及Servlet程序的创建 我们主要在Servlet程序中实现业务逻辑,自然要先熟悉Servlet程序开发环境的搭建及程序的创建. 详见博文:微信公众号开发技术基础(一):Eclipse+Tomcat搭建本地服务器并跑通HelloWorld程序 (二)外网映射工具的准备 从上一篇博文中的数据交互原理中可以看出,我们的本地后台服务器是需要直接和微信服务器进行交互的,而微信服务器必须访问一个公网的地址,无法访问我们本地的地址.因此,需要一个外网映射工

微信公众号开发教程详细完整第1篇

| 版权声明:本文为博主原创文章,未经博主允许不得转载. 从2014.12月份左右接触微信公众号开发,短短续续也有了一年多在这期间做了不知道多少个公众号,各种奇葩的功能都有涉猎.从一无所知的小白,到对整个微信公众号生态的理解,不知道经历了多少个日日夜夜,鬼知道我经历了什么.此次教程不谈什么微信公众号O2O(基本死光了)也不谈什么分答,大字(基本被微信封的差不多了),这次我们只是对微信公众号的二次开发者们,希望对你们有所帮助,也希望有更多的朋友一起探讨,讨论. 下面说一下这个教程的前言:首先此次教

微信公众号开发入门心得(一)

一.前言 为了快速了解微信公众号开发过程,我选择了php语言来进行微信公众号开发,选择php的原因有两点,一是网上有很多用php开放微信公众号的教程,可以减少学习成本:二是php也比较容易学习,学习门槛低. 学习php开发微信公众号,开发者需要有一点php基础.对于学过其他编程语言的童鞋,了解一些基本的php语法就可以开始了.我的 PHP基础学习笔记(一) 二.微信公众号开发的步骤 三.微信公众号开发步骤详解   + 微信公众号开发入门可以参考 微信公众平台开发入门教程 教程中用的新浪云做的服务

《初识Java微信公众号开发》 学习中遇到的困难

前一段时间无聊的时候,在慕课网上自学了一点点微信公众号开发(受学姐威胁). 慕课网教程的地址:http://www.imooc.com/learn/368 毕竟是免费的课程,不可能讲的那么详细.所以我吧我遇到的问题跟大家分享一下. 这是我照着课程敲的代码(IDE是Eclipse): https://github.com/Zuosy/WeiXin 发到github上面了. 为了这个,我还专门到廖大的网站上学了一遍Git. 廖大的Git教程传送们:https://www.liaoxuefeng.co

微信公众号开发总结

最近公司用到了微信公众平台,所以研究了一下微信公众号的开发技术,总体来说比较简单,结合现有的平台核技术,实现起来非常方便. 首先先来了解一下微信公众平台. "微信,是一个生活方式" ,这是微信的自我评价,是不是觉得如果那天不在朋友圈里分享一下自己的最新状态, 并且收到几个赞和评价的话,会觉得空虚寂寞呢?它实实在在的改变了我们的生活方式. " 微信,也是一个生意方式 ",在微信成为我们日常必备之app的同时,它同样具备巨大的的商业 或许不应该称为潜力,因为有很多人已经

微信公众号开发80端口映射之搭建ngrok服务器

说明 了解本文之前,最好先看前篇:<<微信公众号开发80端口映射解决方案>>.最近公司要搞微信公众号开发,需要解决80端口映射的问题,为了稳定可靠,只好自己搭建ngrok服务端.ngrok 是一个使用go语言编写的反向代理软件,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网穿透.ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放. 环境和条件 服务器Centos6.8_x64+windows10_x64 一台有公网ip的服务器 域名解析到服务

C#微信公众号开发 -- (五)自定义菜单创建

公众号中,底部都是有自己定义的功能按钮,通过点击某个按钮来实现指定的业务逻辑操作. 下面就来说说这些按钮是怎样放到微信公众平台的,还是先来看看微信的官方解释: 请注意: 1.自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单. 2.一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替. 3.创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单, 如果菜单有更新,就会刷

.NET C#微信公众号开发远程断点调试(本地远程调试生产环境)

最近在做微信公众号开发,由于之前没有接触过,突然发现调试不方便,不方便进行断点跟踪调试.因为微信那边绑定的服务器地址必须是公网地址,但是还是想进行断点调试(毕竟这样太方便了) 因此上网搜了一下,发现好多是使用软件之类的进行请求转发从生产环境转发请求到开发环境上,发现有的太麻烦了. 突然想到Vs有一个附加到进程的远程调试.于是玩了一把.我们直接开始(服务器上就不要使用发布版本代码了,代码和本地开发一样,不然是不能调试的) 本篇是以开发环境的Visual Studio2013旗舰版以及生产环境里阿里