刚写的微信获取access_token的代码,发上来做个记录,也希望大家共同探讨.
<?php
/**
* 用于更新微信access_token
* Class WechatAccessToken
*/
namespace Wechat;
class WechatAccessToken {
private $appId;
private $appSecret;
private $WechatAccessToken = array();
// 最后申请时间
protected $lastApplyTime = 0;
// 间隔时间 : 50秒内的申请算连击,根据每天只能调用2000次估算出来
protected $intervalTime = 50;
public function __construct($WechatAccessToken, $appId='xxxxxxx', $appSecret='xxxxx') {
$this->WechatAccessToken = $WechatAccessToken;
$this->appId = $appId;
$this->appSecret = $appSecret;
}
/**
* 取得微信的accessToken
*/
public function getWechatAccessToken() {
# 提前10分钟获取token
$pre = 110 * 60;
// 如果没有access_token信息,则更新access_token
if (count($this->WechatAccessToken) == 0) {
$this->setWechatAccessToken();
}
// 如果到期时间在10分钟内,就更新access_token
if ($this->lastApplyTime || $this->lastApplyTime - time() >= $pre) {
$this->setWechatAccessToken();
}
return $this->WechatAccessToken['access_token'];
}
/**
* 申请token
*/
private function setWechatAccessToken( ) {
// 50 秒内不能查询两次,避免一下子将整天的查询次数都用光了
if ( time() - $this->lastApplyTime < $this->intervalTime ) {
return $this->returnArr(0,'获取微信公众号token失败,50 秒内不能查询两次','');
}
$appId = $this->appId;
$secret = $this->appSecret;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$secret}";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl,CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
$data = curl_exec($curl);
curl_close($curl);
if ( ! $data ) {
return $this->returnArr(0,'获取微信公众号token失败,返回为空','');
}
$result = json_decode($data, true);
// {"access_token":"16_pyPL1eL_jcT-EevdHGKZ6ohFxvQgQjYSl9AWKbEElW99aIDhtzJ6sI7oWHY1EXIuGI-KVPBxsgorLmNj6Ms83yR_cjGvLBGsg_o6UCaNtVENgm35XVFDTh0Snx4SGLfAGADRW","expires_in":7200}
if ( ! $result ) {
return $this->returnArr(0,'获取微信公众号token失败,返回异常:'.$data,'');
}
// 写文件
$resultData = array(
'WechatAccessToken' => array(
'access_token' => $result["access_token"],
'prev_time' => time(),
'expires_in' => $result["expires_in"],
)
);
file_put_contents("Data/Config/WechatAccessToken.inc.php", "<?php \nreturn " . var_export($resultData, true) . ";\n?>");
$this->WechatAccessToken = $resultData['WechatAccessToken'];
return $this->returnArr(1,'获取微信公众号token成功',$result["access_token"]);
}
public function returnArr($status, $msg, $data){
$data = array(
'status' => $status,
'msg' => $msg,
'data' => $data,
);
return $data;
}
}
调用部分:
use Wechat\WechatAccessToken;
$WechatAccessToken = new WechatAccessToken(C('WechatAccessToken'));
echo $WechatAccessToken->getWechatAccessToken();
WechatAccessToken.inc.php如下:
<?php
return array (
'WechatAccessToken' =>
array (
'access_token' => '16_3KKxDqYFiak8RmG2TPVNbZvRqHwZUUMFqcVGlPyynalk9_vnpQZM1ozkG4TV0qr9d1uvtgwSLBI345ieUIkV3Cyfay2nUsNPzeDeEncVI2wTvzjG_PL0cTDTtNt1WgVPjTBMqJQ1Yg95zZvlJAIdAJACTB',
'prev_time' => 1543912023,
'expires_in' => 7200,
),
);
?>