¿Cómo almacenar en caché el token de WeChat a través de PHP?
Las API de WeChat requieren la entrada del token, al que se accede a través de la siguiente API :
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
En caso de éxito, devuelve la cadena del token y la caducidad en segundos. Hay un límite de velocidad para llamar a esta API, por lo que tenemos que almacenar en caché la cadena del token localmente para evitar llamar a la API con demasiada frecuencia. Si el token aún no ha caducado, llamar a la API simplemente devolverá el mismo token.
Llamar a la API tiene latencia de red y debemos reutilizar el token siempre que podamos. La mejor manera es almacenarlo en caché localmente a través de una base de datos o un archivo. El siguiente script PHP verificará los tokens en caché almacenados y su validez.
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 "";
}