Redis存储AccessToken
AccessToken 2小时有效。
就不要每次都调取了,这样会造成浪费。
或者存入Session中,设置过期时间。
或者存入Redis中,设置过期时间。
过期之后,进行重新获取。
<?php
class WeixinAction extends CommonAction{
public $red;
const TOKEN_EXPIRES = 1000;
public function _initialize(){
parent::_initialize();
vendor('Func.Red');
$this->red = Red::create();
}
// 获取access_token
public function get_access_token() {
// 查询缓存中是否存在
$k = "access_token_".C('APPID');
if ($this->getCacheTtl($k)) {
return $this->getCache($k);
}
vendor('Func.Http');
// 获取Token
$request_url = "https://api.weixin.qq.com/cgi-bin/token?";
$request_url .= "grant_type=client_credential&appid=".C('APPID')."&secret=".C('APP_SECRET');
$data = json_decode(Http::doGet($request_url,30),true);
$this->setCache($k,$data['access_token'],$data['expires_in'] - self::TOKEN_EXPIRES);
return $data['access_token'];
}
// 存
protected function setCache($k, $v, $expires = -1)
{
if ($expires == -1) {
return $this->red->set($k, $v);
} else {
return $this->red->setex($k, $expires, $v);
}
}
// 取
public function getCache($k) {
return $this->red->get($k);
}
// 查看剩余时间
public function getCacheTtl($k)
{
$ttl = $this->red->ttl($k);
if ($ttl != '-2') {
return $ttl;
} else {
return false;
}
}
// 查看是否存在
public function cacheExists($k)
{
return $this->red->exists($k);
}
}
想得到AccessToken需要知道AppID和AppSecret。这两个数据,可以配置起来。
然后需要初始化Redis。
然后需要几个独立的Redis函数。
存储,获取,判断是否过期。
判断Redis中是否存在,且未过期。
如果有,直接获取。
如果没有,通过HttpGet请求,得到AccessToken。存入Redis中,并返回。
Redis很强大,只要保证key值不重复,就可以存储任何数据。
这里key值通过AppID进行唯一标示,防止有别的access_token也要存储。
PHP的redis扩展函数,功能强大!