Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26012
  • 博文数量: 4
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 19:22
个人简介

live a easy life.

文章分类

全部博文(4)

文章存档

2014年(4)

我的朋友

分类: PHP

2014-03-31 14:02:21

与微信类似,易信公众平台也需要access_token,且其每日有获取限制,且每次获取的access_token都有其生存时限。所以我们需要将获取的access_token缓存起来,每次使用时再判断其时限。
yixin.class.php
文件的类 YixinAccess 中添加私有方法 checkToken


  1.     // 检查access_token是否在有效期内
  2.     // 如果在,则返回保存的 access_token
  3.     // 否则从接口获取 access_token 并将其存入缓存文件;
  4.     private function checkToken()
  5.     {
  6.         // 先读取缓存文件;
  7.         $re = $this->readCache();
  8.         if($re)
  9.         {
  10.             // 文件有内容
  11.             if($re['access_token']) // 保存有access_token内容;
  12.             {
  13.                 $expires_in = $re['expires_in'];
  14.                 $access_time = $re['access_time'];
  15.                 $now_time = time();
  16.                 $dif = $now_time - $access_time;
  17.                 // 是否超期限
  18.                 if($dif >= $expires_in)
  19.                 {
  20.                     // 重新获取access_token
  21.                     $aryToken = $this->getAccessToken();
  22.                     if($aryToken)
  23.                     {
  24.                         // 写入缓存文件;
  25.                         $this->writeCache($aryToken);
  26.                         // 返回 access_token;
  27.                         return $aryToken['access_token'];
  28.                     }
  29.                     else return false;
  30.                 }
  31.                 else return $re['access_token']; // 直接返回缓存的 access_token ;
  32.     
  33.             }
  34.             else
  35.             {
  36.                 // 重新获取access_token
  37.                 $aryToken = $this->getAccessToken();
  38.                 if($aryToken)
  39.                 {
  40.                     // 写入缓存文件;
  41.                     $this->writeCache($aryToken);
  42.                     // 返回 access_token;
  43.                     return $aryToken['access_token'];
  44.                 }
  45.                 else return false;
  46.             }
  47.                 
  48.         }
  49.         else
  50.         {
  51.             // 重新获取access_token
  52.             $aryToken = $this->getAccessToken();
  53.             if($aryToken)
  54.             {
  55.                 // 写入缓存文件;
  56.                 $this->writeCache($aryToken);
  57.                 // 返回 access_token;
  58.                 return $aryToken['access_token'];
  59.             }
  60.             else return false;
  61.         }
  62.     }

可以看到,在我们的接口中如果需要用到 access_token,则可以通过 $access_token = $this->checkToken() 方式获得。其中用到四个方法如下:
1、以文件形式保存系统日志 log($data):

  1.     // 记录日志到文本文件;
  2.     private function log($data)
  3.     {
  4.         @$handle = fopen($this->f_logs,'a');
  5.         if($handle)
  6.         {
  7.             // 写入文件
  8.             fwrite($handle,"=============================================================\r\n");
  9.             fwrite($handle,'行为:'.$data."\r\n");
  10.             fwrite($handle,"时间:".date('Y-m-d H:i:s',time())."\r\n");
  11.             fclose($handle);
  12.         }
  13.     }
2、从access_token缓存文件读取 access_token 的方法:

  1.     // 读取access_token缓存
  2.     // 成功返回数组否则返回0
  3.     private function readCache()
  4.     {
  5.         @$handle = fopen($this->f_token,'r');
  6.         if($handle)
  7.         {
  8.             return unserialize(fread($handle, filesize ($this->f_token)));
  9.         }
  10.         else return 0;
  11.     }
3、将获取的access_token写入缓存文件的方法:
  1.     // 写access_token缓存文件
  2.     // 成功返回1否则返回0
  3.     private function writeCache($aryToken)
  4.     {
  5.         if(@file_put_contents($this->f_token,serialize($aryToken)))
  6.         {
  7.             $this->log('写入access_token缓存成功。');
  8.             return 1;
  9.         }
  10.         else
  11.         {
  12.             $this->log('写入access_token缓存失败。');
  13.             return 0;
  14.         }
  15.     }
4、从易信接口获取access_token的方法:
  1.     // 从易信接口获得 access_token
  2.     // 成功返回数组否则返回0
  3.     private function getAccessToken()
  4.     {
  5.         $url = '';
  6.         $url .= '&appid='.APPID.'&secret='.SECRET;
  7.         $re = file_get_contents($url,false);
  8.         $aryToken = json_decode($re,true);
  9.         if($aryToken['errcode'])
  10.         {
  11.             // 接口返回错误
  12.             // 记录日志
  13.             $this->log('获取access_token失败,错误码:'.$aryToken['errcode']);
  14.             return 0;
  15.         }
  16.         else
  17.         {
  18.             $aryToken['access_time'] = time();
  19.             // 记录日志;
  20.             $this->log('获取access_token成功。');
  21.             return $aryToken;
  22.         }
  23.     }
getAccessToken()方法用到了常量 APPID & SECRET,这个在验证开发者之后易信就会给你了,我们只需在接口文件 echo.php 中定义他们就可以了,例如:
  1. <?php
  2. require_once('./yixin.class.php');
  3. ini_set('date.timezone','Asia/Shanghai'); // 设置本地时区;

  4. // 定义TOKEN常量;
  5. define('TOKEN','yxTest');
  6. // 开发者凭据;
  7. define('APPID','Your APP_ID');
  8. define('SECRET','Your APP_SECRET');



阅读(2403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~