前端不可直接调用getwxacodeunlimit,因access_token敏感且微信强制校验request域名;必须由后端或云函数调用,前端仅传业务参数,后端拼scene、缓存token、返回base64图片。

前端直接调用 getwxacodeunlimit 生成带参小程序码在正式环境必然失败,因为 access_token 不得暴露在前端,且微信接口强制校验 request 域名 —— 这不是配置问题,是安全机制硬性限制。
为什么不能在 uni-app 前端直接调用 getwxacodeunlimit
线上版本会报错:https://api.weixin.qq.com 不在以下 request 合法域名列表中。原因有二:
-
access_token依赖appid和appSecret,二者属于敏感凭证,微信明确禁止前端参与获取 -
getwxacodeunlimit接口要求POST请求体为 JSON,且响应类型必须是arraybuffer,uni-app 在真机或体验版中无法绕过域名校验发起该请求 - 即使开发工具里能跑通,发布后空白或 404,因为线上环境禁用非白名单域名的 HTTPS 请求
必须走后端(或云函数)的最小可行路径
核心逻辑是:前端只传业务参数(如 itemId=123),由后端拼装 scene、调用微信接口、返回 base64 图片数据。
微信聊天分析助手 v2.1.0 — 完全本地运行的隐私保护工具。 分析聊天记录,推断 MBTI 与大五人格,检测情感趋势,生成可视化报告。 支持 jieba 精准分词、否定识别、反讽检测、风险预警。 内置 RAG 检索增强预测和多智能体博弈模拟,完全本地化、零数据外传。 可选 MiroFish 群体智能引擎增强对话预测。
- 后端需缓存
access_token(有效期 2 小时),避免每次请求都重新拉取 - 推荐用 Redis 存储 token,key 可设为
wechat:access_token,并设置过期时间略小于 7200 秒(防临界失效) - 云开发场景下,直接写一个云函数
generateQrCode,内部调用uniCloud.httpclient.request访问微信接口即可,无需自己搭服务 - 返回给前端的数据建议是纯 base64 字符串(如
"data:image/png;base64,iVBOR..."),前端直接赋值给<image></image>的src
scene 参数解析必须在 onLoad 中 decodeURIComponent
小程序扫码进入时,参数藏在 options.scene 里,但它是 URL 编码过的字符串,不手动解码会得到乱码或截断。
- 错误写法:
const id = options.scene.split('=')[1]—— 若 scene 是id=abc%2Fdef,直接 split 会拿到abc%2Fdef,不是真实值 - 正确写法:
const scene = decodeURIComponent(options.scene),再用new URLSearchParams(scene)或手动split('&')解析键值对 - 注意:
onLoad只在页面首次加载时触发,如果用户从后台切回前台,不会再次触发,参数只来一次 - 若需全局访问,可在
App.vue的onLaunch或onShow中统一处理options.query.scene
env_version 和 check_path 容易被忽略的细节
这两个参数控制生成码的可用范围,线上和测试环境行为差异极大:
-
env_version必须显式指定:"release"(正式版)、"trial"(体验版)、"develop"(开发版)。不传默认是"release",意味着你用开发版生成的码扫出来可能跳转失败 -
check_path默认为true,表示微信会校验page路径是否存在于已发布的版本中。开发阶段可设为false,但上线前必须改回true,否则会报错page is not found -
page必须是小程序内真实存在的路径,且不能带后缀(如写成pages/detail/detail.vue会失败,应为pages/detail/detail) - 宽度
width参数仅对getwxacode有效,getwxacodeunlimit不支持,强行传会被忽略
真正卡住人的地方往往不是代码怎么写,而是 token 生命周期管理、scene 解码时机、以及 env_version 和 check_path 在不同环境下的组合行为 —— 这些点不验证到真机扫码环节,很难提前发现。










