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

2023-07-15 13:11:17

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

# 背景

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

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

# 实现方法

  1. 在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了

  1. 调用函数。为了方便我们可以以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地址添加到公众号后台的白名单当中就可以了。

# 参考资料

本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 许可协议。可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

扫描下方二维码阅读当前文章

浏览器、微信扫码

评 论:

好文推荐
每天进步一点点~