课程中心 问答&分享 读书 注册、登录 关闭菜单
《微信公众号开发权威教程》
目录
第一章 课程介绍及环境部署 课程介绍及环境部署 第二章 开发者模式接入及消息回复 2.1 开发者模式接入 2.2 接收客户消息及openId 2.3 回复文本消息 2.4 回复图文消息 2.5 封装slog函数记录接口信息 第三章 获取接口调用凭据 3.1 基础知识 - curl 3.2 获取access token 3.3 获取微信服务器IP地址 第四章 接收事件推送 4.1 关注/取消关注事件 4.2 上报地理位置事件 第五章 菜单创建及菜单点击事件 5.1 接口形式创建自定义菜单 5.2 自定义菜单点击事件的识别 第六章 微信网页开发 6.1 微信网页授权-微信登录 6.2 微信JS-SDK介绍 6.3 微信JS-SDK部署 6.4 分享接口的实现 6.5 图片接口 6.6 音频接口 第七章 素材管理 7.1 新增临时素材 7.2 获取临时素材 7.3 新增永久素材 7.4 获取素材列表及素材总数 7.5 删除永久素材 第八章 微信盖楼游戏 8.1 盖楼游戏原理 8.2 盖楼游戏源码 第九章 天气查询 9.1 百度免费天气API介绍 9.2 微信公众号天气查询开发
3.2 获取access token

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去获取素材、发送多客服消息、创建菜单等等...... 要学会!

CopyRight © 2011 - 2016 Hcoder.net 陕ICP备14004669号-2
客服QQ : 1265928288