首页 课程中心 问答&分享 读书 公众号框架 HUI H.JS 开放源 登录 & 注册
 《微信公众号开发权威教程》

access_token介绍

access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。


保存access_token的原理

1、在服务器上使用一个文本文件 access_token.txt 记录access_token

2、第一次监测是文本不存在则通过curl获取它并保存到 access_token.txt。

3、之后的过程是先读取access_token.txt中的信息,监测有效期,如果超时就重新获取否则直接使用。


接口调用请求说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
公众号可以使用AppID和AppSecret调用本接口来获取access_token。
AppID和AppSecret可在微信公众平台官网-开发页中获得(需要已经成为开发者,且帐号没有异常状态)


函数封装及代码编写

1、在wx.php 头部增加常量

<?php
define("TOKEN"    , "wxtest2016");
define("appid"    , "wxecbdf50f2ffea20f"); //新增 + 
define("appsecret", "eb2e237b0ed8624d4fd87a718ae2285b"); //新增 +

AppID和AppSecret可在微信公众平台官网-开发页中获得(需要已经成为开发者,且帐号没有异常状态)


2、函数封装

在weChat类中增加成员变量:

class weChat{
    ......
    public $accessTokenFile = 'accessToken.txt'; //accessToken文件地址 新增+
    public $accToken;     //accToken 内容 新增+


在weChat类中增加以下函数:

//获取access token
public function getAccessToken(){
    //判断本地AccessToken是否存在,如果不存在就获取
    if(!file_exists($this->accessTokenFile)){
	$this->getAccessTokenBase();
    }else{
	$str = file_get_contents($this->accessTokenFile);
	$arr = json_decode($str, true);
	if(time() - $arr['get_time'] < ($arr['expires_in'] + 100)){$this->accessToken = $arr['access_token'];}else{$this->getAccessTokenBase();}
    }
}
//获取getAccessToken基础函数
public function getAccessTokenBase(){
    $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.appid.'&secret='.appsecret;
    $res = $this->curlGet($url); //返回格式 {"access_token":"xxx....","expires_in":7200}
    //将josn转换为数组
    $arr = json_decode($res, true);
    $arr['get_time'] = time();
    file_put_contents($this->accessTokenFile, json_encode($arr));
    $this->accessToken = $arr['access_token'];
}


3、完整代码演示 使用 getAccessToken() 获取 accessToken

<?php
define("TOKEN"    , "wxtest2016");
define("appid"    , "wxecbdf50f2ffea20f");
define("appsecret", "eb2e237b0ed8624d4fd87a718ae2285b");
$wechatObj = new weChat();
$wechatObj->getAccessToken();
echo $wechatObj->accessToken;

class weChat{
	public $postObj;      //接收到的xml对象
	public $openId;       //客户的openId
	public $ourOpenId;    //我方公众号的openId
	public $msgType;      //客户消息的类型
	public $curlStatus;   //curl 状态信息
	public $accessTokenFile = 'accessToken.txt'; //accessToken文件地址
	public $accessToken;     //accToken 内容
	//构造函数用于接收消息
	public function __construct(){
		if(!empty($GLOBALS["HTTP_RAW_POST_DATA"])){
			//将xml转换成对象
			libxml_disable_entity_loader(true);
			$this->postObj      = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
			$this->openId       = $this->postObj->FromUserName;
			$this->ourOpenId    = $this->postObj->ToUserName;
			$this->msgType      = $this->postObj->MsgType;
		}
	}
	/* 回复图文消息
	 * $msgArray格式
	 * $msgArray = array(
	 * 		array('项目标题', '描述', '图片地址', '点击项目打开的Url'),
	 * 		array('项目标题', '描述', '图片地址', '点击项目打开的Url'),
	 *      有几个项目就设置几个数组元素
	 * );
	 */
	public function reItemMsgs($msgArray){
		$xml = '<xml><ToUserName><![CDATA['.$this->openId.']]></ToUserName><FromUserName><![CDATA['.$this->ourOpenId.']]></FromUserName><CreateTime>'.time().'</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>'.count($msgArray).'</ArticleCount><Articles>';
		foreach($msgArray as $val){
			$xml .= '<item><Title><![CDATA['.$val[0].']]></Title><Description><![CDATA['.$val[1].']]></Description><PicUrl><![CDATA['.$val[2].']]></PicUrl><Url><![CDATA['.$val[3].']]></Url></item>';
		}
		$xml .= '</Articles></xml>';
		echo $xml;
	}
	//回复文本消息
	public function reTextMsg($msg){
		$xml = '<xml><ToUserName><![CDATA['.$this->openId.']]></ToUserName><FromUserName><![CDATA['.$this->ourOpenId.']]></FromUserName><CreateTime>'.time().'</CreateTime>
<MsgType><![CDATA[text]]></MsgType><Content><![CDATA['.$msg.']]></Content></xml>';
		echo $xml;
	}
	//接口认证函数
	public function valid(){
		$echoStr = $_GET["echostr"];
		if($this->checkSignature()){echo $echoStr; exit();}
	}
	//认证消息签名认证函数
	private function checkSignature(){
		if (!defined("TOKEN")){throw new Exception('TOKEN is not defined!');}
		$signature = $_GET["signature"];
		$timestamp = $_GET["timestamp"];
		$nonce = $_GET["nonce"];
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode($tmpArr);
		$tmpStr = sha1( $tmpStr );
		if($tmpStr == $signature ){return true;}else{return false;}
	}
	//获取access token
	public function getAccessToken(){
		//判断本地AccessToken是否存在,如果不存在就获取
		if(!file_exists($this->accessTokenFile)){
			$this->getAccessTokenBase();
		}else{
			$str = file_get_contents($this->accessTokenFile);
			$arr = json_decode($str, true);
			if(time() - $arr['get_time'] < ($arr['expires_in'] + 100)){
				$this->accessToken = $arr['access_token'];
			}else{
				$this->getAccessTokenBase();
			}
		}
	}
	//获取getAccessToken基础函数
	public function getAccessTokenBase(){
		$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.appid.'&secret='.appsecret;
		$res = $this->curlGet($url); //返回格式 {"access_token":"xxx....","expires_in":7200}
		//将josn转换为数组
		$arr = json_decode($res, true);
		$arr['get_time'] = time();
		file_put_contents($this->accessTokenFile, json_encode($arr));
		$this->accessToken = $arr['access_token'];
	}
	//curl get 方式 封装
	public function curlGet($url){
		$ch   = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false);
		curl_setopt($ch, CURLOPT_ENCODING       , 'gzip,deflate');
		$res  = curl_exec($ch);
		$this->curlStatus = curl_getinfo($ch);
		curl_close($ch);
		return $res;
	}
	/*
	 * curl POST 方式
	 * 参数1 $url
	 * 参数2 $data 格式 array('name'=>'test', 'age' => 18)
	 */
	public function curlPost($url, $data){
		$ch   = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER , true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST , false);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		curl_setopt($ch, CURLOPT_ENCODING       , 'gzip,deflate');
		$res  = curl_exec($ch);
		$this->curlStatus = curl_getinfo($ch);
		curl_close($ch);
		return $res;
	}
}


4、access_token 有何用??

在下面的课程中会使用access_token去获取素材、发送多客服消息、创建菜单等等...... 要学会!

书籍目录  (请点击阅读)