Comment mettre en cache le jeton WeChat via PHP ?
Les API WeChat nécessitent la saisie du jeton, accessible via l’ API suivante :
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
En cas de succès, il renvoie la chaîne de jeton et l’expiration en secondes. Il existe une limite de débit pour appeler cette API, nous devons donc mettre en cache la chaîne de jeton localement pour éviter d’appeler l’API trop fréquemment. Si le jeton n’a pas encore expiré, l’appel de l’API renverra simplement le même jeton.
L’API d’appel a une latence de réseau et nous devons réutiliser le jeton chaque fois que nous le pouvons. Le meilleur moyen est de le mettre en cache localement via une base de données ou un fichier. Le script PHP suivant vérifiera les jetons en cache stockés et leur validité.
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 "";
}