我们知道,在公众号的开发中,有很多接口需要access_token才能访问,但是如果每次需要用到access_token的时候,都通过appid和appsecret去获得access_token,又有些资源浪费,毕竟,每个access_token的有效期都是7200秒,所以就只好通过将access_token通过保存文件的方式缓存下来,每次需要用到access_token的时候直接读取文件,如果token没有过期,那么就不去向微信服务器请求新的access_token,这样就很方便了,毕竟,关注用户多的时候,2000次的请求次数根本不够用。

目标:将获得的access_token保存到.properties文件中,每次请求access_token的时候,优先读取properties文件,判断token是否过期,如果已过期,重新想微信服务器发送请求获得access_token,否则,直接返回文件中保存的access_token。

首先,是Properties.php文件类的代码,Properties类提供读取属性、修改属性的方法,类似传统的properties文件,每个属性设置一行,用“=”号隔开,如下:

<?php
/** 科学改变世界* CopyRight 2018- All Rights Reserved* Properties文件相关操作:* -打开文件* -读取属性设置* -修改属性设置* -保存文件*/class Properties{private $_path;private $_properties;//打开文件public function openFile($_file){$this->_path = fopen($_file, "r+") or exit("Unable to open file!");stream_set_timeout($this->_path, 0);$this->_properties = array();if( flock($this->_path, LOCK_EX) ){//加写锁 while(!feof($this->_path)){$keywords = fgets($this->_path);$line = preg_replace('/\n|\r\n/','',$keywords);if($line != ''){$key_value = explode('=', $line);$this->_properties[] = $key_value;}}ftruncate($this->_path,0); // 将文件截断到给定的长度 rewind($this->_path); // 倒回文件指针的位置 flock($this->_path, LOCK_UN); //解锁 }}//读取文件属性public function getProperty($_key){$exist = FALSE;foreach ($this->_properties as $val) {if($val[0] == $_key){$exist = TRUE;return $val[1];}}if(!$exist){return 'NO EXISTS.';}}//设置文件属性public function setProperty($_key, $_value){$exist = FALSE;for($_i=0; $_i<count($this->_properties); $_i++){$_item = $this->_properties[$_i];if($_item[0] == $_key){$exist = TRUE;$_item[1] = $_value;$this->_properties[$_i] = $_item;}}if(!$exist){$this->_properties[] = array($_key, $_value);return TRUE;}}//保存文件public function saveFile(){$contents = '';foreach ($this->_properties as $val) {$_line = implode('=', $val);$contents = $contents.$_line."\r\n";}fwrite($this->_path, $contents);fclose($this->_path);}
}?>

在服务器同一目录下,我们再创建一个token.php文件,这个文件用于接收get请求并返回token,代码如下:

<?php
/** 科学改变世界* CopyRight 2018- All Rights Reserved* token相关操作:* -url请求获得token并保存* -token有效期内直接读取文件获得token*/// 引入属性类
include 'Properties.php';class Token
{// 定义AppId和AppSecret// 请自行修改为自己公众号的appId和appSecretprivate $AppId = 'AppId';private $AppSecret = 'AppSecret ';//获取access_tokenprivate function getAccessToken(){$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->AppId . "&secret=" . $this->AppSecret;//通过自定义函数getCurl得到https的内容$data = getCurl($url);//转为数组$resultArr = json_decode($data, true);//获取access_tokenreturn $resultArr["access_token"];}// 获得tokenpublic function getToken(){$tokenFile = __DIR__.'/conf/token.conf';$prop = new Properties();$prop->openFile($tokenFile);$token_way = $prop->getProperty('way');$token_create = $prop->getProperty('create');// 如果token失效,就重新申请tokenif((intval($token_create)+7200) < time()) {$token = $this -> getAccessToken();$prop->setProperty('token', $token);$prop->setProperty('create', time());}else {$token = $prop->getProperty('token');}$prop->saveFile();return $token;}
}function getCurl($url) {//get https的内容$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不输出内容curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);$result = curl_exec($ch);curl_close($ch);return $result;
}$response = ['code' => 200,'token' => (new Token())->getToken()
];echo json_encode($response, TRUE);?>

同样的,在当前目录下新建文件夹conf,并在里面新建token.conf文件,每次需要用到access_token的时候直接访问token.php文件就可以了。

PHP微信公众号开发之:获得和缓存access_token,原理及代码相关推荐

  1. 微信公众号开发之VS远程调试

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

  2. 微信公众号开发之 “`高级接口`” 总结

    微信公众号开发之 "高级接口" 总结 代码如下: <?php// $weixin = new class_weixin("", "") ...

  3. WeChat - 微信公众号开发之.Net Core接入

    .net进行微信公众号开发的例子好像比较少,这里做个笔记 首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之 ...

  4. 微信公众号开发之H5页面跳转到指定的小程序

    前言: 最近公司有一个这样的需要,需要从我们在现有的公众号H5页面中加一个跳转到第三方小程序的按钮.之前只知道小程序之间是可以相互跳转的,今天查阅了下微信开发文档原来现在H5网页也支持小程序之间的跳转 ...

  5. 微信公众号开发之jfinal wxin

    jfinal wxing大家可能不太熟悉,他是jfinal框架(中国开源框架),用这个做微信公众号开发,非常快的,因为他已经把所有的微信的接口都集成里面了,我们主要是调用它的按口 要是你们PM要快点开 ...

  6. 微信公众号开发之40164错误,获取不到access_token,获取不到jsapi_ticket错误问题...

    公司用开的微信签名接口突然间不能用了,调用的时候一直获取不到jsapi_ticket临时凭证,搞的我一脸懵逼,然后回想了下,接口代码没动过呀,公众号后台也只是设置过一次ip白名单,可是后来想了下,觉得 ...

  7. c# 微信公众号开发之token验证第三方服务器

    初入微信,才发现真的一坑又一坑,小程序之前坑可能是前辈填掉了,前辈走后,公司开始搞公众平台,需要公众号开发,唯一后端的我,顶了上去. 服务器配置验证token,从官方文档理解就是,官方发送signat ...

  8. 微信公众号开发之40164错误,导致获取不到access_token

    唉,刚解决access_token 失效的问题 ,又来一波 报错 40164  ['..IP...XXXX'] 第一想到的就是微信开发文档的全局返回码 但是就是没有 40164   烦啊!! 其实还是 ...

  9. 标梵互动:微信公众号开发之node第二篇

    accessToken凭证获取 access_token是调用微信接口的唯一凭证,目前有效期为两小时,调用上限为每日2000次,access_token过期后需要重新获取 一:功能实现思路 查看本地是 ...

  10. 微信公众号开发之(21)视频

    视频 微信中发视频的形式: 链接 wap播放页 [网站视频链接,html形式] 自己视频ckplayer [视频播放插件] 这次专讲 如何使用ckplayer插件实现 下载clplayer百度云盘地址 ...

最新文章

  1. Go语言的Channel文章,整个人都感觉不好了
  2. windows常用命令(高级语句篇)
  3. 010_SpringBoot视图层技术thymeleaf-变量输出与字符串操作
  4. tableau必知必会之运用本福德定律(Benford‘s law)验证数据真实性
  5. VMware-使用VMware在本地搭建多个CentOS虚机
  6. Ubuntu 16.04安装Cobbler 2.9
  7. Android 最简单的MVP案例;
  8. 工作任务(2012-01-03)
  9. arcpy.mapping常用四大件-MapsurroundElement
  10. 全网首发:LINUX OpenCV编译java/jar版本注意事项
  11. 向android模拟器中复制文件报out of memory错误解决
  12. 10KV高压电缆的直流耐压究竟是多少?
  13. cl.exe nmake.exe
  14. netperf测试最大连接数
  15. mysql自学完整_MySQL自学篇(三)
  16. 用户/账户/账号的理解
  17. 内网穿透,让自己的电脑当服务器
  18. VHDL数字时钟设计及引脚锁定方法
  19. 工作日志:502 Bad Gateway异常分析
  20. 开立证券账户常见问题

热门文章

  1. 20159318 《网络攻防实践》第2周学习总结
  2. PID控制KP.KI.KD用法
  3. python去除重复单词_Python程序,用于删除给定句子中的所有重复单词。
  4. 移动端touch事件影响界面click/超链接事件无法点击
  5. 小曾带你刷牛客03(Java版本)
  6. matlab用摄像头拍照,matlab调用摄像头拍照
  7. 360断网急救箱 dns服务器未响应,发现DNS服务异常,用360断网急救箱修复后过一段时间又复发。怎么办?...
  8. 国科大英语Unit4
  9. 计算机系统引导失败怎么办,win7系统引导选择失败怎么办|win7系统引导选择失败的解决方法...
  10. python股票技术指标计算,python股票量化交易(3)---趋势类指标MACD