可扩展性很强。

<?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. mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库

    简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠 ...

  2. Python之登陆接口设计

    刚刚开始学习Python,第一个编写的程序. import os user_file = open('use_file.txt', 'r') user_list = user_file.readlin ...

  3. poj 1410 计算几何

    /** 注意: 千万得小心..就因为一个分号,调了一个晚上... **/ #include <iostream> #include <algorithm> using name ...

  4. C 根据行来读取文件 字符串的截取

    // TestCFile.cpp : Defines the entry point for the console application. // #include "stdafx.h&q ...

  5. HeapAnalyzer

    https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=4544baf ...

  6. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

  7. Boyer–Moore (BM)字符串搜索算法

    在计算机科学里,Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法.它由Bob Boyer和J Strother Moore设计于1977年.此算法仅对搜索目标字符串(关键字)进行预处 ...

  8. 关于DLL搜索路径顺序的一个问题

    DLL的动态链接有两种方法.一种是加载时动态链接(Load_time dynamic linking).Windows搜索要装入的DLL时,按以下顺序:应用程序所在目录→当前目录→Windows SY ...

  9. hdoj 1166 敌兵布阵(树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 思路分析:该问题为动态连续和查询问题,使用数组数组可以解决:也可使用线段树解决该问题: 代码如下 ...

  10. java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

    我现在用的是hibernate3.6final,出现了下面这个异常:(当我使用@ManyToOne时,不会出现异常,而且用@ManyToMany也正常) Caused by: java.lang.No ...