获取微信access_token
2018-10-19 本文已影响0人
iyangxuqing
<?php
/*
获取 access_token
access_token 是全局唯一接口调用凭据,开发者调用各接口时都需使用 access_token,请妥善保存。
access_token 的存储至少要保留512个字符空间。access_token 的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。
公众平台的 API 调用所需的 access_token 的使用及生成方式说明:
为了保密 appsecrect,第三方需要一个 access_token 获取和刷新的中控服务器。
而其他业务逻辑服务器所使用的 access_token 均来自于该中控服务器,不应该各自去刷新,否则会造成 access_token 覆盖而影响业务;
目前 access_token 的有效期通过返回的 expires_in 来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新 access_token。
在刷新过程中,中控服务器对外输出的依然是老 access_token,此时公众平台后台会保证在刷新短时间内,新老 access_token 都可用,这保证了第三方业务的平滑过渡;
access_token 的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,
还需要提供被动刷新 access_token 的接口,这样便于业务服务器在 API 调用获知 access_token 已超时的情况下,可以触发 access_token 的刷新流程。
开发者可以使用 AppID 和 AppSecret 调用本接口来获取 access_token。
AppID 和 AppSecret 可登录微信公众平台官网-设置-开发设置中获得(需要已经绑定成为开发者,且帐号没有异常状态)。
AppSecret 生成后请自行保存,因为在公众平台每次生成查看都会导致 AppSecret 被重置。
注意调用所有微信接口时均需使用 https 协议。如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新 access_token,那么就可能会产生冲突,导致服务不稳定。
接口地址:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
*/
require_once('../config.php');
echo json_encode($result);
exit();
////////////////////////////////////////////////////////////////////////////////////////////////////
function getAccessTokenFromDB()
{
GLOBAL $_mysqli;
$_sql = "SELECT accessToken, expired FROM accessToken";
$_result = $_mysqli->query($_sql);
if($row = $_result->fetch_assoc()){
$accessToken = $row['accessToken'];
$expired = $row['expired'];
if($expired > time() + 600){
return $result = array(
'accessToken' => $accessToken,
'expired' => $expired
);
}
}
}
function getAccessTokenFromWX()
{
GLOBAL $_mysqli;
$appId = APPID;
$appSecret = APPSECRET;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret";
$res = https_request($url);
$res = json_decode($res);
if($res->access_token){
$id = 1;
$accessToken = $res->access_token;
$expired = $res->expires_in + time();
$_sql = "INSERT INTO accessToken (id, accessToken, expired) VALUES ('{$id}', '{$accessToken}', '{$expired}')";
$_sql = $_sql . "ON DUPLICATE KEY UPDATE accessToken=VALUES(accessToken), expired=VALUES(expired)";
$_result = $_mysqli->query($_sql);
if($_result){
return $result = array(
'accessToken' => $accessToken,
'expired' => (string)$expired //因为数据库取出的值为字符串类型,这里为了返回的数据类型统一,也转换为字符串类型输出
);
}
}
}
?>