node.js与微信小程序后台数据库的交互(3)如何保存accesstoken
【node.js与微信小程序后台数据库的交互(3)如何保存accesstoken】参考文章: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_tokenconst hostIp = '127.0.0.1';
const apiPort = 6060;
const data=https://www.it610.com/article/{
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文件,实际部署的时候可以把这两句去掉。
推荐阅读
- 「微信小程序开发 | 轮播图」
- 微信8.0安卓版来了
- PostgreSQL长事务与失效的索引查询浅析介绍
- PostgreSQL游标与索引选择实例详细介绍
- 微服务架构学习与思考(04)(微服务技术体系)
- 投稿|羊了个羊爆红的底层逻辑与启示:反常规创新,还有机会
- 投稿|夹缝中的企业微信
- 深度学习|【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第三周浅层神经网络作业
- 神经网络|神经网络与深度学习(一)- Logistic Regression as a Neural Network
- [DL]神经网络与深度学习|[2022-09-05]神经网络与深度学习第0章-basic‘s basic(part 2)