PHP validation of the micro-channel access_token expires deposit redis, get

EDITORIAL

About access_token micro letter, we often encounter the problem is the failure, once failure access_token, with its related operations can not be carried out, then how to avoid it. Redis use, storage processing can be avoided without fail, the request is repeated (to prevent over the limit)!

First, the failure to verify access_token, get access_token, and get into redis

-Redis_access_token_service.php
/**
 * 从redis获取access_token
 *
 * @desc 判断access_token是否失效,未失效,统一从指定服务器151获取access_token;失效,获取,返回,并存入redis
 * @author NangongYi
 * @time 2019/09/28 00:57:58
 *
 */

class Redis_access_token_service
{

    /**
     * 获取access_token
     */
    public function get_t_access_token()
    {
        return $this->check_access_token_is_effective();
    }

    /**
     * 从redis里获取access_token
     * @return string
     */
    private function get_access_token_from_t_redis()
    {
        $this->load->library('tredis');
        return $this->tredis->get('t_redis_access_token');
    }

    /**
     * 将access_token存入到 Tredis
     * @param $access_token
     */
    private function store_access_token_in_t_redis($access_token)
    {
        $this->load->library('tredis');
        $this->tredis->set('t_redis_access_token', $access_token);
    }

    /**
     * 判断存入t_redis的access_token是否有效
     * @desc 无效,获取;有效,返回。
     * @return string $access_token
     */
    private function check_access_token_is_effective()
    {
        $access_token = $this->get_access_token_from_t_redis();
        $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=".$access_token;
        $result = $this->https_request($url);
        $data = json_decode($result,true);
        if($data['errcode'] == '40001'){
            $access_token = $this->get_access_token_from_wechat();
            $this->store_access_token_in_t_redis($access_token);
        }
        return $access_token;
    }

    /**
     * https请求
     * @param $url
     * @return mixed
     */
    private function https_request($url)
    {
        $ch = curl_init(); // 创建句柄
        curl_setopt($ch, CURLOPT_URL, $url); // 通过url获取数据
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    /**
     * 从微信端请求access_token
     * @return mixed
     */
    private function get_access_token_from_wechat()
    {
        // 从配置文件获取配置参数
        $this->load->config('dict/wechat_config');
        $appConfig = $this->config->item('dict_wechat_user');
        // 请求地址
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.
            $appConfig['app_id'].'&secret='.$appConfig['secret'];
        $ch = curl_init(); // 创建句柄
        curl_setopt($ch, CURLOPT_URL, $url); // 通过url获取数据
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 跳过证书验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是
        $output = json_decode(curl_exec($ch));
        $access_token = $output->access_token;
        curl_close($ch);
        return $access_token;
    }

}

Two, Tredis class, define the connection, and a relevant operating

-Tredis.php
/**
 * access_token存放的统一Redis
 * @author NangongYi
 * @time 2019/09/29
 */

class Tredis
{
    /**
     * [Class Property Description]
     *
     * @var [data type]
     * @access [public/protected/private]
     */
    private $_redis = NULL;

    /**
     * [Class Property Description]
     *
     * @var [data type]
     * @access [public/protected/private]
     */
    private $_redis_conf = [
        'hostname' => '56.89.116.78',
        'port' => 9870
    ];

    /**
     * [Class Property Description]
     *
     * @var [data type]
     * @access [public/protected/private]
     */
    const NO_RESULT = NULL;

    /**
     * 默认的缓存键
     */
    const CONF_KEY_DEFAULT = 'T_redis';

    /**
     * Constuction
     * @param    array        configuration of redis
     * @desc    boolean        true for sucess or false for faillure
     */
    function __construct($conf_key = NULL)
    {
        $conf_key = ($conf_key == NULL || empty($conf_key['conf_key'])) ?
         self::CONF_KEY_DEFAULT : $conf_key['conf_key'];
        $CI =& get_instance();
        $conf = [];
        if ($CI->config->load('redis', FALSE, TRUE)) {
            if (is_array($CI->config->config[$conf_key])) {
                $conf = $CI->config->config[$conf_key];
            }
        }
        $this->_redis_conf = array_merge($this->_redis_conf, $conf);
        try {
            // redis hostname error
            if (empty($this->_redis_conf['hostname'])) {
                throw new RedisException();
            }
            $this->_redis = new redis();
            $single = $this->_redis->connect($this->_redis_conf['hostname'],
                $this->_redis_conf['port'], $this->_redis_conf['timeout']);
            if (!$single) {
                $this->_redis = NULL;
            }
        } catch (RedisException $e) {
            $this->_redis = NULL;
        }
    }

    /**
     * Storage a value to the redis
     * @access    public
     * @param    string
     * @param    string
     * @param    int  time of living(seconds), if the value is 0s, then the value is permanent.
     * @return    boolean  success return TRUE, failure return FALSE.
     */
    public function set($key, $value, $ttl = 0)
    {
        if ($this->_is_connect() === FALSE) {
            return self::NO_RESULT;
        }
        $ttl = intval($ttl);
        if ($ttl) {
            $result = $this->_redis->setex($key, $ttl, $value);
        } else {
            $result = $this->_redis->set($key, $value);
        }
        return $result;
    }


    /**
     * get value(s)
     *
     * @access    public
     * @param    string
     * @return    mix        return value of the key
     */
    public function get($key)
    {
        if ($this->_is_connect() === FALSE) {
            return self::NO_RESULT;
        }
        return $this->_redis->get($key);
    }

    /**
     * check redis connect or not
     * @return boolean
     */
    private function _is_connect()
    {
        return $this->_redis ? TRUE : FALSE;
    }

    /**
     * 检查redis连接情况
     */
    public function check_connect()
    {
        return $this->_is_connect();
    }

}
So, to be a consolidation, to facilitate future look, if you can help, but also for others to it.
Published 59 original articles · won praise 2 · Views 5575

Guess you like

Origin blog.csdn.net/LDR1109/article/details/102949839