Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

开放平台大幅重构并且添加测试 #606

Merged
merged 10 commits into from
Mar 8, 2017
Merged

Conversation

tsunamilx
Copy link
Contributor

重构的原因是因为不好用。。。

原来的只是封装了 API 的调用,缓存了 component_verify_ticket,但对于授权和授权方的信息没有做任何处理,尤其是 authorizer_access_tokenauthorizer_refresh_token 的缓存。

因为第三方平台须要使用 authorizer_access_token 来调用各 API,authorizer_access_token 又须要 authorizer_refresh_token 来刷新,authorizer_refresh_token 又要通过授权才能获得,要进行授权又要先有 component_verify_ticketcomponent_access_token ... 说多了都是泪 ...

此重构的主要目的就是想封装掉 authorizer_access_tokenauthorizer_refresh_token 的获取和缓存。

主要重构内容:

  1. 尽量使用 Container 来获取实例而不是直接 new,主要修改在 OpenPlatformServiceProviderOpenPlatform\Guard 两个类上。
  2. 修改各种 token 的缓存 key 为 easywechat.open_platform.*
  3. 重构 4 个 EventHandler,分别处理授权成功,授权更新,授权取消和 verify ticket。
  4. 添加 AuthorizerToken 用来替换原 AccessToken 来调用 API。
  5. 添加了单元测试。

中英文文档随后会另外提交。

Copy link
Collaborator

@overtrue overtrue left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NB,不过建议容器名称那里在同一类东西时使用 . 分割

};

// Authorization events handlers.
$pimple['open_platform_handle_component_verify_ticket'] = function($pimple) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

其实可以考虑使用 . :比如:open_platform.handles.component_verify_ticket

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

那就统一所有 open platform 的类都这样咯:
open_platform
open_platform.access_token
open_platform.handlers.component_verify_ticket

@overtrue overtrue merged commit 512c0eb into w7corp:master Mar 8, 2017
if (is_array($message)) {
$message = new Collection($message);
}
$handler = $this->getDefaultHandler($message->get('InfoType'));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的 InfoType 会不会是 MsgType? @tsunamilx

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OpenPlatform 相关的消息类型是 InfoType

@jeftom
Copy link
Contributor

jeftom commented Mar 31, 2017

@tsunamilx 实例化 Application($config) 的时候是不是先要把 component_access_token 加到 $config 配置里?不然获取不了 $app->oauth->user()

@tsunamilx
Copy link
Contributor Author

第三方平台的 OAuth 倒是没有考虑过,等我研究研究先。

@tsunamilx
Copy link
Contributor Author

@jeftom
我觉得把 component_access_token 放入 config 不妥,config 应该保持静态。

构思:

$app->oauth\Overtrue\Socialite\Providers\WeChatProvider 实例。
$app->oauth->user() 方法就是 \Overtrue\Socialite\Providers\AbstractProvider::user() 方法。

方案一
AbstractProvider::user() 接受参数 AccessTokenInterface,所以可以自定义 token 以适应第三方平台。可行性和难度未做分析。注意此 AccessToken 为 OAuth 的 token,与其他 API 的 AccessToken 不通用。

方案二
另作一个第三方平台专门的 OAuth,比如 OpenPlatformAuthProvider extends WeChatProvider,注入 OpenPlatform\AccessToken 来获得 component_access_token,在覆盖 WeChatProvider 相关方法以适应第三方平台需求。
然后修改容器注册过程:
\EasyWeChat\Foundation\ServiceProviders\OAuthServiceProvider::register
(以下伪代码)

$pimple['oauth'] = function ($pimple) {

    $socialite = new Socialite(...);
    if ( is open platform ) {
        $socialite->drive(open platform auth);
    } else {
        $socialite->drive(wechat);
    }

}

我个人认为方案二比较适合。@overtrue, @mingyoung 意下如何?

@mingyoung
Copy link
Collaborator

同样觉得方案二比较适合。😜
已经写了个第三方平台专门的 OAuth,详见 overtrue/socialite#48
另外开放平台代码正在重构完善当中了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants