php - 微信 - 缓存access_token类。

可扩展性很强。

<?php
namespace LaneWeChat\Core;
/**
 * 微信Access_Token的获取与过期检查
 * Created by Lane.
 * User: lane
 * Date: 13-12-29
 * Time: 下午5:54
 * Mail: lixuan868686@163.com
 * Website: http://www.lanecn.com
 *
 * 使用说明(用sae中kvdb举例):
    //  1 首先编写两个方法,一个设置缓存,一个取缓存。(例子中的,_setSaeKvdb()/_getSaeKvdb(),函数名称随意。)
    //  2 在[_setCacheAccessToken/_getCacheAccessToken]方法中添加相应的case(上面所编写的方法。)。
    //  3 更改常量[CACHE_ACCESSTOKEN_TYPE]的值,你要在第二步骤中使用case后的值。
 * 
 */
class AccessToken{

    /**
     * 使用的缓存类型,设置缓存与使用缓存,均要用到次常量。
     */
    const CACHE_ACCESSTOKEN_TYPE = 'kvdb';

    /**
     * 获取微信Access_Token
     */
    public static function getAccessToken(){
        // 获取缓存access_token,无缓存返回false。
        $accessToken = self::_getCacheAccessToken(self::CACHE_ACCESSTOKEN_TYPE);

        // 判断得到的access_token是否存在,以及是否过期,如过期或者不存在,则重新获取。
        if(empty($accessToken['access_token']) || $accessToken['expires_in'] < time()){
            $accessToken = self::_getAccessToken();
        }

        // 返回access_token
        return $accessToken['access_token'];
    }

    /**
     * @descrpition 从微信服务器获取微信ACCESS_TOKEN
     * @param string $cacheType 缓存access_token,默认使用sae中的kvdb
     * @return Ambigous|bool
     */
    private static function _getAccessToken(){
        // 从微信服务器获取access_token
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&app&secret='.WECHAT_APPSECRET;
        $accessToken = Curl::callWebServer($url, '', 'GET');
        if(!isset($accessToken['access_token'])){
            return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败');
        }

        // 缓存 access_token
        self::_setCacheAccessToken($accessToken, self::CACHE_ACCESSTOKEN_TYPE);

        // 返回 access_token
        return $accessToken;
    }

    /**
     * 缓存access_token
     */
    private static function _setCacheAccessToken($data, $cacheType) {
        switch ($cacheType) {
            case 'kvdb':
                // 使用sae中的KVDB缓存access_token
                self::_setSaeKvdb($data);
                break;
            
            // 其他缓存方法,请自行添加

            default: break;
        }
    }

    /**
     * 获取缓存的 access_token
     * @param  [type] $cacheType 使用的缓存类型
     * @return [type]            [description]
     */
    private static function _getCacheAccessToken($cacheType) {
        $data = array();
        switch ($cacheType) {
            case 'kvdb':
                $data = self::_getSaeKvdb();
                break;
            
            // 其他获取缓存的方法,自行添加。

            default: break;
        }
        return $data;
    }

    /**
     * 使用sae中的KVDB进行缓存
     * @param [type] $data [description]
     */
    private static function _setSaeKvdb($data) {
        // 使用KVDB存储会话
        $kv = new \SaeKV();
        $kv->init('4ywk0l2yzo');
        // delete original kvdbs
        $kv->delete('access_token');
        $kv->delete('expires_in');
        // write new kvdb
        $kv->add('access_token', $data['access_token']);
        $kv->add('expires_in', time() + 7000);
    }
    /**
     * 获取存储在 SAE 中KVDB中的access_token
     * @return [type] [description]
     */
    private static function _getSaeKvdb() {
        // 使用KVDB存储会话
        $kv = new \SaeKV();
        $kv->init('4ywk0l2yzo');
        // get kvdb data
        $data['access_token'] = $kv->get('access_token');
        $data['expires_in'] = $kv->get('expires_in');
        return $data;
    }
}