可扩展性很强。

<?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;
}
}

  

php - 微信 - 缓存access_token类。的更多相关文章

  1. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  2. 微信公众号的搭建-第四天(2)-获取并缓存access_token

    1. 什么是access_token? 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等 ...

  3. Java开发微信公众号(五)---微信开发中如何获取access_token以及缓存access_token

    获取access_token是微信api最重要的一个部分,因为调用其他api很多都需要用到access_token.比如自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等在请求的时候 ...

  4. 微信开发 access_token 数量限制问题

    微信对access_token的请求有数量限制, 如果用户量特别多的话, access_token  可能会不够用 两种方案: 1.  access_token 加入缓存并设置2小时的失效时间,每次从 ...

  5. Android手机清除微信缓存

    方法一: 1.任意找一个微信好友,给他发送网址 http://debugx5.qq.com 2.自己点击这个网址跳转 3.进入后看到下面的页面,通过勾选第二张截图的Cookie和文件缓存来清除微信缓存 ...

  6. thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase

    本节主要介绍缓冲相关的传输类,缓存的作用就是为了提高读写的效率.Thrift在实现缓存传输的时候首先建立一个缓存的基类,然后需要实现缓存功能的类都可以直接从这个基类继承.下面就详细分析这个基类以及一个 ...

  7. 利用Spring.Net技术打造可切换的分布式缓存读写类

    利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具 ...

  8. [Cache] C#操作缓存--CacheHelper缓存帮助类 (转载)

    点击下载 CacheHelper.zip CacheHelper 缓存帮助类 C#怎么操作缓存 怎么设置和取缓存数据,都在这个类里面呢 下面看一下代码吧 /// <summary> /// ...

  9. thrift之TTransport层的内存缓存传输类TMemoryBuffer

    内存缓存是简单的在内存进行读写操作的一种传输,任何时候想在上面写入数据都是放入缓存中,任何时候读操作数据也是来至于缓存.内存缓存的分配使用c语言的malloc类函数,分配的长度是需要长度的两倍,需要考 ...

随机推荐

  1. rhApp遇到的项目问题

    1.如果有多人同时操作一个桌台的情况下,如何处理: 2.index页面点击清空的时候是否要把桌台一起清掉: 3.账单界面已结账的小单背景色是否需要和未结账的不同:

  2. Qt的Model/View Framework解析(数据是从真正的“肉(raw)”里取得,Model提供肉,所以读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了)

    最近在看Qt的Model/View Framework,在网上搜了搜,好像中文的除了几篇翻译没有什么有价值的文章.E文的除了Qt的官方介绍,其它文章也很少.看到一个老外在blog中写道Model/Vi ...

  3. [置顶] LED办公楼宇照明节能方案及城市夜景照明节能方案

    LED照明办公楼宇节能方案 .通用标准灯头,可直接替换现有卤素灯.白炽灯.荧光灯.

  4. CF 192 Div2

    A.Cakeminator 暴搞之,从没有草莓覆盖的行.列遍历 char map[30][30]; int vis[30][30]; int hang[30],lie[30]; int main() ...

  5. leetcode_question_67 Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...

  6. OpenStack_Swift源代码分析——Object-auditor源代码分析(1)

    1 Object-auditor 的启动 Object-auditor的启动和object-replicator的启动过程是一样的,首先是运行启动脚本 swift-init object-audito ...

  7. fopen()函数

    1.2 文件的输入输出函数 键盘.显示器.打印机.磁盘驱动器等逻辑设备, 其输入输出都能够通过文件管理的方法来完毕.而在编程时使用最多的要算是磁盘文件, 因此本节主要以磁盘文件为主, 具体介绍Turb ...

  8. nopcommerce插件使用

    nopcommerce是国外用.net开发的电商b2c开源项目,主要涉及技术包括了ef+mvc. 今天主要分析nop的插件机制. 什么是插件?插件是预先开发好的可以独立运行的功能模块,把单独的功能模块 ...

  9. WebForm发布提示:无法加载或找不到oracle.dataaccess文件

    出错提示: 在32位错做系统的开发机上引用了第三方插件(oracle的dataaccess)完成的项目,将发布的程序拷贝到64位的服务器上进行发布时提示无法加载或找不到dataaccess文件. 错误 ...

  10. guava中eventbus注解使用

    guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...