php - 微信 - 缓存access_token类。
2016-07-18 14:41
776 查看
可扩展性很强。
<?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&appid='.WECHAT_APPID.'&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; } }