详解Node.js access_token的获取、存储及更新
在开发微信公众号等基于微信平台的应用时,我们通常需要使用access_token进行接口调用。本文将详细介绍Node.js获取、存储和更新access_token的完整攻略。
获取access_token
获取access_token需要向微信服务器发送GET请求,具体的接口地址为:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
其中,APPID为微信公众号的AppID,APPSECRET为微信公众号的AppSecret,这两个参数需要在微信公众平台上进行配置。
我们可以使用node-fetch
模块来发送请求,代码如下:
const fetch = require('node-fetch');
// 获取access_token
async function getAccessToken(appid, secret) {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`;
const response = await fetch(url);
const json = await response.json();
return json.access_token;
}
存储access_token
获取access_token后,我们需要将其存储起来,以便后续的接口调用。通常我们将其存储在数据库或内存中,这里我们选用MongoDB作为存储介质。
首先我们需要安装mongodb
模块:
npm install mongodb --save
然后我们可以编写代码进行MongoDB的连接和access_token的存储,代码如下:
const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017';
const dbName = 'wechat';
const collectionName = 'access_tokens';
// 存储access_token
async function saveAccessToken(appid, access_token) {
const client = await MongoClient.connect(url, { useNewUrlParser: true });
const db = client.db(dbName);
const collection = db.collection(collectionName);
const result = await collection.updateOne({ appid }, { $set: { access_token } }, { upsert: true });
client.close();
}
更新access_token
access_token的有效期为2小时,过期后需要重新获取。因此我们需要编写代码来定时更新access_token。这里我们可以使用node-schedule
模块来实现定时任务。
首先我们需要安装node-schedule
模块:
npm install node-schedule --save
接着,我们可以编写代码来定时更新access_token,代码如下:
const schedule = require('node-schedule');
// 定时任务,每隔1小时更新一次access_token
function scheduleUpdateAccessToken(appid, secret) {
const rule = new schedule.RecurrenceRule();
rule.minute = 0; // 每个小时的0分更新一次access_token
schedule.scheduleJob(rule, async () => {
const access_token = await getAccessToken(appid, secret);
await saveAccessToken(appid, access_token);
console.log(`access_token updated: ${access_token}`);
});
}
示例说明
以下是一个完整示例,代码中的APPID
和APPSECRET
需要替换成自己的配置:
const fetch = require('node-fetch');
const { MongoClient } = require('mongodb');
const schedule = require('node-schedule');
const url = 'mongodb://localhost:27017';
const dbName = 'wechat';
const collectionName = 'access_tokens';
const appid = 'APPID'; // 替换成自己的AppID
const secret = 'APPSECRET'; // 替换成自己的AppSecret
// 获取access_token
async function getAccessToken(appid, secret) {
const url = `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${secret}`;
const response = await fetch(url);
const json = await response.json();
return json.access_token;
}
// 存储access_token
async function saveAccessToken(appid, access_token) {
const client = await MongoClient.connect(url, { useNewUrlParser: true });
const db = client.db(dbName);
const collection = db.collection(collectionName);
const result = await collection.updateOne({ appid }, { $set: { access_token } }, { upsert: true });
client.close();
}
// 定时任务,每隔1小时更新一次access_token
function scheduleUpdateAccessToken(appid, secret) {
const rule = new schedule.RecurrenceRule();
rule.minute = 0; // 每个小时的0分更新一次access_token
schedule.scheduleJob(rule, async () => {
const access_token = await getAccessToken(appid, secret);
await saveAccessToken(appid, access_token);
console.log(`access_token updated: ${access_token}`);
});
}
// 启动定时任务
scheduleUpdateAccessToken(appid, secret);
以上示例中,我们使用了node-fetch
模块来发送请求,使用mongodb
模块来连接MongoDB数据库,使用node-schedule
模块来实现定时任务。我们通过getAccessToken
函数获取access_token,通过saveAccessToken
函数将access_token存储到MongoDB中,通过scheduleUpdateAccessToken
函数定时更新access_token。我们使用schedule.scheduleJob
函数来执行定时任务,定时更新access_token的周期为1小时。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Node.js access_token的获取、存储及更新 - Python技术站