Skip to content
This repository has been archived by the owner on Aug 3, 2021. It is now read-only.

自定义refresh_token

wangyi edited this page Dec 22, 2016 · 1 revision

自定义refresh_token处理

契约

定义了AuthorizerRefreshToken必须要去实现的三个方法:

  1. getRefreshToken($authorizerAppId) 通过公众号ID获取refresh_token(刷新access_token时要使用)
  2. setRefreshToken($authorizerAppId, $authorizerRefreshToken) 存储公众号的refresh_token(授权或者更新授权事件时使用)
  3. removeRefreshToken($authorizerAppId) 删除公众号的refresh_token(取消授权时使用)
<?php
namespace Chunhei2008\EasyOpenWechat\Contracts;

interface AuthorizerRefreshTokenContract
{
    /**
     * get refresh token by app id
     * @param $authorizerAppId
     *
     * @return mixed
     */
    public function getRefreshToken($authorizerAppId);

    /**
     *
     * set refresh token by app id
     * @param $authorizerAppId
     * @param $authorizerRefreshToken
     *
     * @return mixed
     */

    public function setRefreshToken($authorizerAppId, $authorizerRefreshToken);

    /**
     * remove refresh token by app id
     * @param $authorizerAppId
     *
     * @return mixed
     */
    public function removeRefreshToken($authorizerAppId);
}

伪代码实现DB存储

<?php
namespace Chunhei2008\EasyOpenWechat\Core;

use Chunhei2008\EasyOpenWechat\Contracts\AuthorizerRefreshTokenContract;
use Chunhei2008\EasyOpenWechat\Support\Log;
use Chunhei2008\EasyOpenWechat\Traits\CacheTrait;
use Doctrine\Common\Cache\Cache;

class AuthorizerRefreshTokenDB implements AuthorizerRefreshTokenContract
{

    /**
     *
     * get refresh token
     *
     * @param $authorizerAppId
     *
     * @return mixed|string
     */
    public function getRefreshToken($authorizerAppId)
    {
        // select refresh_token from db by app id
        Log::debug('Get refresh token from cache:', [$authorizerAppId, $authorizerRefreshToken]);
        return $authorizerRefreshToken;
    }

    /**
     * set refresh token
     *
     * @param $authorizerAppId
     * @param $authorizerRefreshToken
     */

    public function setRefreshToken($authorizerAppId, $authorizerRefreshToken)
    {
        // insert or update refresh token by app id
        Log::debug('Set refresh token:', [$authorizerAppId, $authorizerRefreshToken]);
    }

    /**
     *
     * remove refresh token
     *
     * @param $authorizerAppId
     */
    public function removeRefreshToken($authorizerAppId)
    {
        // delete refresh token by app id
        Log::debug('Remove refresh token:', [$authorizerAppId]);
    }

}

对应的服务提供者

<?php

namespace Chunhei2008\EasyOpenWechat\Foundation\ServiceProviders;

use Chunhei2008\EasyOpenWechat\Core\AuthorizerRefreshTokenDB;
use Pimple\Container;
use Pimple\ServiceProviderInterface;

class AuthorizerRefreshTokenDBServiceProvider implements ServiceProviderInterface
{
    public function register(Container $pimple)
    {
        $pimple['authorizer_refresh_token'] = function ($pimple) {
            return new AuthorizerRefreshTokenDB();
        };
    }
}

使用示例

$config = [
    'debug'                => true,
    'component_app_id'     => 'wxd954……',                                   //第三方平台app id
    'component_app_secret' => 'a7a48d271…………',                              //第三方平台app secret
    'token'                => 'easy-open-wechat-token',                     //公众号消息校验Token
    'aes_key'              => '90ID6sSTuY……Uh6BWDct',                       //公众号消息加解密Key
    'redirect_uri' => 'http://yourhostname/authcallback.php',               //公众号授权回调页面
    'log' => [
        'level' => 'debug',
        'file'  => '/tmp/easyopenwechat.log',
    ],
];
$providers = [
    AuthorizerRefreshTokenDBServiceProvider:class     
];
$app = new \Chunhei2008\EasyOpenWechat\Foundation\Application($config);
//添加服务覆盖refresh_token
$app->addProviders($providers);