Hur cachelagrar jag WeChat Token via PHP?
WeChat API:er kräver inmatning av token, som nås via följande API :
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
Vid framgång returnerar den tokensträngen och utgången på några sekunder. Det finns en hastighetsgräns för att anropa detta API så vi måste cache tokensträngen lokalt för att undvika att anropa API för ofta. Om token inte har gått ut ännu, kommer anrop av API:et att returnera samma token.
Att anropa API har nätverkslatens och vi bör återanvända token när vi kan. Det bästa sättet är att cache det lokalt via databas eller fil. Följande PHP-skript kommer att kontrollera de cachade tokens som lagras och dess giltighet.
define('APPID', 'APPID');
define('APPSECRET', 'APPSECRET');
define('TOKENFILE', 'token.txt');
define('EXPIRY', 'expiry.txt');
date_default_timezone_set('UTC');
function getToken() {
$tokenfile = TOKENFILE;
$expiryfile = EXPIRY;
if (is_file($tokenfile)) {
$token = trim(file_get_contents($tokenfile));
}
if ($token && is_file($expiryfile)) {
$x = (integer)trim(file_get_contents($expiryfile));
if ($x > 0) {
if (time() < $x) { // token still valid
return $token;
}
}
}
// invoke wechat API if token is not found or has expired
$url = "<a class="vglnk" target="_blank" href="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=" rel="nofollow"><span>https</span><span>://</span><span>api</span><span>.</span><span>weixin</span><span>.</span><span>qq</span><span>.</span><span>com</span><span>/</span><span>cgi</span><span>-</span><span>bin</span><span>/</span><span>token</span><span>?</span><span>grant</span><span>_</span><span>type</span><span>=</span><span>client</span><span>_</span><span>credential</span><span>&</span><span>appid</span><span>=".</span><span>APPID</span><span>."&</span><span>secret</span><span>=</span></a>". APPSECRET;
$data = trim(file_get_contents($url));
if ($data) {
$data = json_decode($data, true);
if ($data) {
$token = $data['access_token'];
$expiry = time() + (integer)$data['expires_in'];
// save for cache until expiry
file_put_contents($tokenfile, $token, LOCK_EX);
file_put_contents($expiryfile, $expiry, LOCK_EX);
return $token;
}
}
// can't get valid token
return "";
}