uni-app前端不可直接调用微信access_token接口,必须通过服务端(如云函数)获取并缓存token;前端仅能调用云函数安全获取,且需正确配置环境变量、ip白名单及缓存刷新逻辑。

uni-app里不能直接调用微信获取access_token接口
微信官方明确禁止前端(包括 uni-app 编译的小程序端)直接请求 https://api.weixin.qq.com/cgi-bin/token,因为这需要 appid 和 appsecret —— 二者一旦暴露在前端,账号就等于裸奔。uni-app 小程序端运行环境本质仍是小程序,不拥有服务端权限,所以任何试图在 onLoad 或 uni.request 中拼接 access_token 请求的行为,都会失败或被微信拦截。
正确路径只有一条:把 access_token 获取逻辑放到服务端(推荐云函数),前端只发起安全的、鉴权后的调用。
云开发环境下用云函数封装 getAccessToken
uni-app 的云开发(基于腾讯云)天然适合做这件事:云函数运行在服务端,可安全存储 appsecret,还能缓存 token 避免频繁刷新。注意别直接在云函数里每次调用都去微信拿新 token —— 微信限制 2000 次/天,且 token 有效期 2 小时,必须本地缓存 + 过期自动刷新。
- 云函数中用
cloud.database()或内存变量(如global.tokenCache)暂存access_token和expires_in时间戳 - 每次调用前先检查缓存是否有效(
Date.now() ),无效再请求微信接口并更新缓存 - 云函数返回结构统一为
{ errCode: 0, accessToken: 'xxx' },前端只处理成功/失败,不解析 token 组成 - 云函数名建议叫
getWxAccessToken,避免和微信原生 API 混淆
const cloud = require('wx-server-sdk')
cloud.init()
exports.main = async (event, context) => {
const { APPID, APPSECRET } = cloud.getWXContext()
// 此处读取缓存逻辑略(可用 db / redis / global)
if (!token || Date.now() > expiresAt) {
const res = await cloud.http.request({
method: 'GET',
url: `https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${APPSECRET}`
})
if (res.data.access_token) {
// 更新缓存(示例用数据库)
await cloud.database().collection('wx_config').doc('token').set({ data: { ...res.data, updatedAt: Date.now() } })
return { errCode: 0, accessToken: res.data.access_token }
}
}
return { errCode: 0, accessToken: token }
}
uni-app 前端调用云函数拿 token 的写法
前端不能自己拼 URL 或塞 appsecret,唯一合法方式是通过 uniCloud.callFunction 调用已部署的云函数。注意几个关键点:
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
- 云函数必须已发布(开发版不可跨端调用),且在 uni-app 项目中配置了正确的
provider(如tcb) - 调用后务必检查
result.errCode,微信返回的errcode是数字(如40001),而云函数返回的errCode是你定义的状态码,别混淆 - 不要在页面
onLoad里反复调用——token 可复用,建议全局单例管理或封装成 Promise 缓存 - 若需用于后续调用微信开放接口(如发送模板消息),把拿到的
accessToken当作参数传给下一个云函数,别在前端拼接https://api.weixin.qq.com/...
简单调用示例:
uniCloud.callFunction({
name: 'getWxAccessToken',
success: res => {
if (res.result.errCode === 0) {
console.log('拿到 token:', res.result.accessToken)
// 后续操作,比如传给另一个发消息的云函数
}
},
fail: err => console.error('云函数调用失败', err)
})
容易忽略的坑:云函数环境变量和权限配置
很多人卡在“云函数里拿不到 APPID/APPSECRET”,其实是没配好环境变量或权限。uniCloud 云函数默认不会自动注入微信配置,必须手动设置:
- 在云函数根目录的
config.json里加"env": "your-env-id",确保它属于当前小程序绑定的云环境 - 在云开发控制台 →「设置」→「环境配置」中,填入真实的
APPID和APPSECRET(不是小程序后台的,是公众号/第三方平台的?注意来源!) - 如果用的是自建服务器而非 uniCloud,那
APPID/APPSECRET必须存在服务端配置文件中,绝不能写死在前端代码或云函数源码里(git 提交即泄露) - 微信侧还要求 IP 白名单:如果你用的是非云开发的自建服务,得把服务器出口 IP 加到公众号后台的「IP 白名单」里,否则请求直接被拒,错误信息是
{"errcode":40164,"errmsg":"invalid ip"}
token 刷新逻辑写得再对,环境配错一步,就永远拿不到有效值。










