【微信第三方平台】授权实现及所使用的框架解析
2016-03-16 12:00
393 查看
又好久没有写博客,最近主要做了两件事。一个是安卓SDK自动打包、加固、热更新的研究,一个是微信第三方平台的授权。第一个虽然有一定的成果,但还没有完善,后续会将过程和技术记录一下,现在先整理下微信第三方平台的授权。
源码地址:EventDispatcher
框架介绍:The EventDispatcher Component
现实中的同学相互联系,要组织个同学会,有可能A去叫B、B又去通知C,A不知道C已经被通知又可能再通知一次等等,画成图则如下:
很明显,这是一个耦合网状结构,哪一个人少了都有可能导致其他人通知不到,而且再往结构中加人时,设计会麻烦、易错。而中介者模式则设立一个中介者,所有交互都通过它来做。如上面的例子,所有同学都加入一个QQ群,则这个QQ群就是一个中介者,通知只要发在QQ群中,则所有同学都会被通知到。画成图表示如下:
中介者模式就是这样一个星形结构,在结构中加人时,设计简单、清晰,扩展性高,耦合度低。
相对独立,耦合度低,便于复用,扩展性好
中介者处理设计需要无瓶颈
A listener (PHP object) tells a central dispatcher object that it wants to listen to the kernel.response event;
在dispatcher中注册一个监听者,告知想要监听kernel.response这个事件
At some point, the Symfony kernel tells the dispatcher object to dispatch the kernel.response event, passing with it an Event object that has access to the Response object;
在需要的位置,告知dispatcher去触发kernel.response这个事件,同时传递事件对象,这个对象包含想要传递的数据
The dispatcher notifies (i.e. calls a method on) all listeners of the kernel.response event, allowing each of them to make modifications to the Response object.
dispatcher去通知所有监听kernel.response事件的监听者,这些监听者都可以对事件对象包含的数据进行修改
这样,就将模块间相互调用转换为了事件触发,实现了模块解耦,结构也变得清晰,当然,由于没有了直接调用,源码阅读起来就麻烦多了^_^,这也是解耦的通病。
然后就是其中具体的实现细节了,不过由于是公司正在使用的代码,不做分析。
第三方平台审核成功后,微信每十分钟会推送component_verify_ticket,注意配置白名单IP,收到后需要解密;
推送信息是用的POST原始数据,需要使用
component_access_token及后面的公众号authorizer_access_token、authorizer_refresh_token注意保存,每天获取这些信息的接口是有调用次数限制的,在快过期时再去刷新;
未全网发布的第三方平台,只有配置在测试公众号中的,才可以进行授权,其他公众号会报『系统错误』;
一、语言-PHP
有幸使用了世界上最好的语言,对于一个年长的程序员来说,语言的语法、函数、变量、特性、面向对象等其实就是在使用中渐渐熟悉,也没有太多研究的价值。不过公司项目的PHP有一个前人留下的通用框架,使用起来蛮方便的,就仔细翻了一下源码。二、框架
1、The EventDispatcher Component——Symfony
框架中使用了一个事件分发框架EventDispatcher,这是Symfony中的一个子框架,可以单独使用,设计使用了中介者模式,可以减少模块间的耦合度,同时加强系统的可扩展性。源码地址:EventDispatcher
框架介绍:The EventDispatcher Component
2、中介者模式
这个设计模式网上一搜资料一堆,简单来说,就是将网状的耦合结构变成一个星形的松散结构。举个例子好理解一下:现实中的同学相互联系,要组织个同学会,有可能A去叫B、B又去通知C,A不知道C已经被通知又可能再通知一次等等,画成图则如下:
很明显,这是一个耦合网状结构,哪一个人少了都有可能导致其他人通知不到,而且再往结构中加人时,设计会麻烦、易错。而中介者模式则设立一个中介者,所有交互都通过它来做。如上面的例子,所有同学都加入一个QQ群,则这个QQ群就是一个中介者,通知只要发在QQ群中,则所有同学都会被通知到。画成图表示如下:
中介者模式就是这样一个星形结构,在结构中加人时,设计简单、清晰,扩展性高,耦合度低。
2.1 中介者模式优点
一对多变成一对一,结构清晰相对独立,耦合度低,便于复用,扩展性好
2.2 中介者模式缺点
中介者本身处于核心位置,压力大,且稳定性要求高中介者处理设计需要无瓶颈
2.3 适用场景
之前也接触过这个设计模式,不过工作中用到的很少,刚好EventDispatcher这个框架用的是中介者模式,可以学习一下。3、EventDispatcher框架
3.1 使用
这个框架使用起来很简单:A listener (PHP object) tells a central dispatcher object that it wants to listen to the kernel.response event;
在dispatcher中注册一个监听者,告知想要监听kernel.response这个事件
At some point, the Symfony kernel tells the dispatcher object to dispatch the kernel.response event, passing with it an Event object that has access to the Response object;
在需要的位置,告知dispatcher去触发kernel.response这个事件,同时传递事件对象,这个对象包含想要传递的数据
The dispatcher notifies (i.e. calls a method on) all listeners of the kernel.response event, allowing each of them to make modifications to the Response object.
dispatcher去通知所有监听kernel.response事件的监听者,这些监听者都可以对事件对象包含的数据进行修改
这样,就将模块间相互调用转换为了事件触发,实现了模块解耦,结构也变得清晰,当然,由于没有了直接调用,源码阅读起来就麻烦多了^_^,这也是解耦的通病。
3.2 实现
上文有源码的链接,代码比较简单,只有几个文件,就不具体分析了。4、PHP框架
上面是公司框架用到的一个子框架,现在分析下主PHP框架。其实从总体来看,主要实现了几个模块:输入、输出、配置、功能。如下图:然后就是其中具体的实现细节了,不过由于是公司正在使用的代码,不做分析。
三、微信第三方授权
微信有官方的授权文档说明:授权流程技术说明,文档里说得很详细,不过有的地方没有提,还有的地方容易出错,这里记录一下。第三方平台审核成功后,微信每十分钟会推送component_verify_ticket,注意配置白名单IP,收到后需要解密;
推送信息是用的POST原始数据,需要使用
$encryptMsg = file_get_contents ( 'php://input' );获取,不能使用
$_POST;
component_access_token及后面的公众号authorizer_access_token、authorizer_refresh_token注意保存,每天获取这些信息的接口是有调用次数限制的,在快过期时再去刷新;
未全网发布的第三方平台,只有配置在测试公众号中的,才可以进行授权,其他公众号会报『系统错误』;
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 微信悄悄升级群聊功能:个人微信营销号的福音
- 突击部队拼多多
- 我是运营,我没有假期
- 如何做到日消息量100万的微信公众号?
- 论微信取消推送功能的可能性(原创)
- Symfony事件类型
- 微信的成功,靠的是QQ导流吗?
- 「Linux 中国」2018 微信文章排行榜
- 一个微信群的兴亡
- 微信服务号推送模板消息接口
- PHP限制页面只能在微信自带浏览器访问的代码
- HTML5实现微信拍摄上传照片功能
- 微信小程序去哪里找 小程序到底如何使用(附小程序名单)
- 使用jQuery.wechat构建微信WEB应用
- 使用JavaScript脚本判断页面是否在微信中被打开
- nw.js实现类似微信的聊天软件