Interfejsy API WeChat wymagają wprowadzenia tokena, do którego dostęp uzyskuje się za pośrednictwem następującego interfejsu API :
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
Po pomyślnym zakończeniu zwraca ciąg tokena i wygaśnięcie w sekundach. Istnieje limit szybkości wywoływania tego interfejsu API, więc musimy buforować ciąg tokena lokalnie, aby uniknąć zbyt częstego wywoływania interfejsu API. Jeśli token jeszcze nie wygasł, wywołanie API po prostu zwróci ten sam token.
Wywołanie API ma opóźnienie sieci i powinniśmy ponownie użyć tokena, kiedy tylko możemy. Najlepszym sposobem jest buforowanie go lokalnie za pośrednictwem bazy danych lub pliku. Poniższy skrypt PHP sprawdzi, czy przechowywane w pamięci podręcznej tokeny i ich ważność.
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 "";
}