共计 2970 个字符,预计需要花费 8 分钟才能阅读完成。
参考文章:Node.js access_token 的获取、存储及更新
https://www.cnblogs.com/hvkco…
和 node.js 与微信小程序后盾数据库的交互(1)获取 accesstoken 相比,咱们前进一步,把获取的 accesstoken 保留到服务器上。
咱们先在 node.js 的服务启动根目录下创立一个 wechat 子目录,在该子目录下创立一个名为 access_token.json 的文件,文件内容为:
{"access_token":"","expires_time":0}
别离保留 accesstoken 和过期工夫。
为了下一步应用 express 设置拜访路由,咱们把 node.js 与微信小程序后盾数据库的交互(1)获取 accesstoken 中的程序修改为应用 express 的模式:
// token.js
const http = require('http');
const request = require('request');
var urltool = require('url');
var fs = require('fs'); // 引入 fs 模块
var accessTokenJson = require('./wechat/access_token');// 引入本地存储的 access_token
const hostIp = '127.0.0.1';
const apiPort = 6060;
const data={
appid:"wx4$%#%#%#",// 你的微信小程序的 appid
secret:"@##¥¥……¥##R¥",// 你的微信小程序的 appsecret
grant_type:"client_credential",
env:"^%$#^@^" // 你的微信小程序的环境参数
};
var express = require('express');
var app = express();
app.get('/', function (req, res) {console.log("***************************************")
console.log('[ 申请] 来自 ='+req.url);
getAccessToken(res);
})
function getAccessToken(res){
// 获取以后工夫
var currentTime = new Date().getTime();
const url='https://api.weixin.qq.com/cgi-bin/token?appid='+data.appid+'&secret='+data.secret+'&grant_type='+data.grant_type;
var contentText = fs.readFileSync('./wechat/access_token.json','utf-8'); // 减少这两句就能够手工批改 access_token.json 的 expires_time 来刷新 accesstoken
accessTokenJson = JSON.parse(contentText)
if(accessTokenJson.access_token === "" || accessTokenJson.expires_time < currentTime){
request({
url: url,// 申请门路
method: "GET",// 申请形式,默认为 get
headers: {// 设置申请头
"content-type": "application/json",
},
body: JSON.stringify(data)//post 参数字符串 将对象转 JSON
}, function(error, response, body) {if (!error && response.statusCode === 200) {var obj = JSON.parse(body); // 将 JSON 字符串转为对象
accessTokenJson.access_token = obj.access_token;
accessTokenJson.expires_time = new Date().getTime() + (parseInt(obj.expires_in) - 200) * 1000;
// 更新本地存储的
fs.writeFile('./wechat/access_token.json',JSON.stringify(accessTokenJson),(err)=>{console.log("write OK")});
// 编码类型
res.setHeader('Content-Type', 'text/plain;charset=UTF-8');
// 容许跨域
res.setHeader('Access-Control-Allow-Origin', '*');
// 返回代理内容
var rtnJSON = JSON.stringify(accessTokenJson)
console.log("返回数据:"+rtnJSON)
res.end(rtnJSON);
}
});
}else{res.setHeader('Content-Type', 'text/plain;charset=UTF-8');
// 容许跨域
res.setHeader('Access-Control-Allow-Origin', '*');
// 返回代理内容
var rtnJSON = JSON.stringify(accessTokenJson)
console.log("返回数据:"+rtnJSON)
res.end(rtnJSON);
}
}
var server = app.listen(apiPort, function () {console.log('代理接口,运行于 http://' + hostIp + ':' + apiPort + '/');
})
微信小程序的 accesstoken 默认是 7200 秒过期,因而咱们的程序在 7000 秒后从新获取新的 accesstoken 并保留到文件中。
启动 token.js 服务:
node token.js
在浏览器中拜访 127.0.0.1:6060 并刷新,咱们会发现返回的 accesstoken 不会变动。咱们期待 2 小时后再刷新,或者批改 access_token.json 的 expires_time 为 0 后再刷新,会发现 accesstoken 扭转了,这样就实现了咱们的目标。
留神:如果咱们不手动批改 access_token.json 文件
var accessTokenJson = require('./wechat/access_token');
下面这句就能够了,不过下面这句如果咱们手动批改了 access_token.json 后不会再次执行,所以咱们加上
var contentText = fs.readFileSync('./wechat/access_token.json','utf-8'); // 减少这两句就能够手工批改 access_token.json 的 expires_time 来刷新 accesstoken
accessTokenJson = JSON.parse(contentText)
这样每次读取 accesstoken 的时候都会去读 access_token.json 文件,理论部署的时候能够把这两句去掉。