您的位置:首页 > 移动开发 > 微信开发

【微信第三方平台】授权实现及所使用的框架解析

2016-03-16 12:00 393 查看
又好久没有写博客,最近主要做了两件事。一个是安卓SDK自动打包、加固、热更新的研究,一个是微信第三方平台的授权。第一个虽然有一定的成果,但还没有完善,后续会将过程和技术记录一下,现在先整理下微信第三方平台的授权。

一、语言-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注意保存,每天获取这些信息的接口是有调用次数限制的,在快过期时再去刷新;

未全网发布的第三方平台,只有配置在测试公众号中的,才可以进行授权,其他公众号会报『系统错误』;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息