Weixin4c微信公众号框架引擎
Weixin4c 是基于C技术环境的微信公众号框架引擎(weixin4c)
1 背景
weixin4c是一个基于C技术环境的建立在FastCGI高性能Web应用服务器架构上的微信公众号框架引擎,它封装了公众号应用服务器底层框架,你只需要编写业务逻辑代码,以回调函数机制接入框架,就能快速构造出微信公众号服务。
用C技术环境开发微信公众号应用的确有些奇怪,但是我没有互联网公司高大上的团队配置(俺只熟悉C)、也没有雄厚的资金支持购买强劲的服务器(俺只有一台单核、半G内存、1M带宽的阿里云最低配主机),所以只能利用最熟悉的C、利用最有限的硬件资源来玩玩微信公众号了,如果选择JAVA估计连跑起来都成问题。
无论用什么语言,首先都要评估所要做的项目的技术背景和技术原理,只要是开放接口都与实现无关,采用C语言,虽然没有大量现成的库可以直接调用,但经过评估,自己研发成本并不大。之前我专门研究了whois爬虫技术,可以把这个作为第一个功能提供给用户使用。于是开搞!
元旦花了一天研究了微信公众平台开发者文档,撰写测试代码以评估接口,确定设计,又花了一天做开发测试,“钛搜索”新鲜上线,第一版提供了域名注册信息实时查询,而后某个工作日晚上又把框架部分和应用部分分离,把框架提炼出来封装成C库,方便做其它公众号,同时也分享给大家研究使用。
2 架构与设计
2.1 体系架构
通过学习微信公众平台开发者文档,我的微信公众号应用服务器接入架构应该是这样的。其中微信客户端可以是手机、PC等,微信服务端其实只做了验证我的应用服务器地址,然后大量转发客户端请求功能,对于我要做的只是自己找网上主机空间搭建一个Web服务器,根据开放接口开发相应服务对接腾讯微信服务端即可。
幸运的是,前段时间我刚好买了一个阿里云主机,虽然是低的不能再低的配置(没钱啊),但跑跑C程序是毫无问题。
2.2 系统架构
既然采用C技术环境,CGI是板上钉钉,但传统的CGI存在频繁创建、销毁进程的系统压力,那就使用FastCGI吧。
本人曾经研发过基于事件模型(epoll in Linux)的服务器软件,感觉要完全写好事件模型还是比较复杂,于是对Nginx的稳定性感觉不是很有信心,还是采用老而弥坚的Apache。至于你的选择,只要你的Web服务器软件支持FastCGI就能使用weixin4c。
暂时还用不到数据库或缓存服务器,以后用到了再加。
总结:支持FastCGI的Web服务器软件+FastCGI(C)模块+(你的应用).fcgi(weixin4c.a)。(这恐怕是世界上执行效率最高的基于高级语言的Web技术方案了吧,呵呵呵,开发效率么...我有大量自己写的、第三方的库,不比JAVA、PHP开发慢哦 ^_^)
2.3 应用结构
公众号应用服务器对接微信服务器的第一步是让微信服务器认证自己的网址是否有效,具体参见微信公众平台开发文档。
一旦认证成功,你的应用服务就算接入微信了,接下去就可以互相收发信息。
比较常见的是微信客户端上发送文本、图片、语音、视频、地理位置信息等,微信服务器转发给你的应用服务器,应用服务器处理后产生响应信息,回复给微信客户端。
还有一些是公众号应用服务器主动发送微信服务器,微信服务器转发给微信客户端,由于安全原因,微信服务器需要公众号应用服务器事先通过获取的接口调用凭据来验证发送者身份。
这种模式放到后面再说,前一种模式的weixin4c内部设计结构如下:
(在word里显示有点小,你可以直接看源码安装包里的"doc/weixin4c.vsd")
Web服务器进程根据微信服务端转发的请求,调起应用demo.fcgi(你可以改成"(你的公众号应用名).fcgi"),main函数里设置一些环境常量和回调函数指针,然后调用weixin4c.a入口函数weixin4c,weixin4c前半部分实现了一个FastCGI基本框架,后半部分实现了微信公众号请求信息接收、筛选、分支调用的通用层框架,公众号应用处理逻辑由demo.fcgi回调函数来挂接实现。
目前实现的回调函数接口有:
进程初始化函数(FastCGI长进程启动时执行一次,像打开redis连接、打开数据库连接啥啥的都可以塞这里面)
进程销毁前清理函数(FastCGI长进程结束时执行一次,其实应用不释放也会被系统释放,但有些应用层正常关闭操作最好还是做一下,如断开数据库连接)
接收事件(订阅/关注、取消订阅/关注)处理函数
接收文本处理函数(当微信客户端发送消息时触发,可以用作命令的响应)
接收图片处理函数(以下有些响应报文布局可能会有些问题)
接收语音处理函数
接收视频处理函数
接收小视频处理函数(以上有些响应报文布局可能会有些问题)
接收地理信息处理函数
接收链接处理函数
备注:为什么采用静态库libweixin4c.a而不采用动态库呢?因为如果采用动态库,需要设置一大堆CGI环境变量,干脆就采用静态库,这样减少框架层运行时库依赖,方便使用。
总结:"weixin4c.a"只是实现了一个微信公众号分拣引擎,由cgi可执行程序"(你的应用名).fcgi"中的main函数调用,main函数同时还会传递一批回调函数指针进去,供"weixin4c.a"分拣引擎确定请求报文类型后回调,就酱紫,很简单吧 ^_^
(具体见doc/weixin4c.doc、doc/weixin4c.vsd)