记录如何使用laf云函数缓存公众号全局access_token
# 背景
平时会用laf云做一些小工具,最近在做公众号相关调研时遇到了缓存token的问题,每天只允许调用2000次,所以需要将公众平台的API调用所需的access_token缓存下来。
我们可以借用laf的云函数来做这个中控服务器统一获取和刷新access_token。
# 实现方法
- 在laf云添加
access_token
集合后新建云函数(例如:wxAccessToken
)后输入如下代码:
import cloud from '@lafjs/cloud'
const db = cloud.database()
export default async function (ctx: FunctionContext) {
let accessToken = await db.collection('access_token').getOne()
let expires_time = accessToken.data ? accessToken.data.expires_time : null
let tokenInfo = {}
if (expires_time == null || Math.floor(Date.now() / 1000) > expires_time + 3600) {
let params = {
method: "get",
url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=[your appid]&secret=[your secret]`
}
tokenInfo = await cloud.fetch(params);
let accInfo = {
access_token: tokenInfo.data.access_token,
expires_time: Math.floor(Date.now() / 1000) + 3600
}
if (expires_time == null) {
await db.collection('access_token').add(accInfo);
} else {
await db.collection('access_token').update(accInfo);
}
tokenInfo = accInfo
} else {
const { access_token, expires_time } = accessToken.data
tokenInfo = {
access_token: access_token,
expires_time: expires_time
}
}
return tokenInfo
}
这样我们就会每隔一小时刷新一次access_token了
- 调用函数。为了方便我们可以以get方式调用:
https://[your laf domain]/wxAccessToken
可以看到类似如下的返回值:
{
"access_token":"xxxxxxxxxxx",
"expires_time":1689392208
}
# 问题处理
在云函数中会请求微信服务器,从而提示如下错误:
data: {
errcode: 40164,
errmsg: 'invalid ip 124.4.21.15 ipv6 ::ffff:124.4.21.15, not in whitelist rid: 64b224c9-40fbffe4-2d188be7'
}
这时我们只需要把错误信息中提示的IP地址添加到公众号后台的白名单当中就可以了。