使用laf云函数进行微信公众号全局access_token缓存

记录如何使用laf云函数缓存公众号全局access_token

# 背景

平时会用laf云做一些小工具,最近在做公众号相关调研时遇到了缓存token的问题,每天只允许调用2000次,所以需要将公众平台的API调用所需的access_token缓存下来。

我们可以借用laf的云函数来做这个中控服务器统一获取和刷新access_token。

# 实现方法

  1. 在laf云新建云函数(例如:wxAccessToken)后输入如下代码:
代码语言:javascript
复制
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了

  1. 调用函数。为了方便我们可以以get方式调用:
代码语言:javascript
复制
https://[your laf domain]/wxAccessToken

可以看到类似如下的返回值:

代码语言:javascript
复制
{
    "access_token":"xxxxxxxxxxx",
    "expires_time":1689392208
}

# 问题处理

在云函数中会请求微信服务器,从而提示如下错误:

代码语言:javascript
复制
data: {
    errcode: 40164,
    errmsg: 'invalid ip 124.4.21.15 ipv6 ::ffff:124.4.21.15, not in whitelist rid: 64b224c9-40fbffe4-2d188be7'
  }

这时我们只需要把错误信息中提示的IP地址添加到公众号后台的白名单当中就可以了。

# 参考资料

  • 获取 Access token
  • Laf云函数