uni-app 无法直接调用微信 getwxacodeunlimit 接口,必须通过服务端中转:uni-app 请求 → 自建服务端(如 spring boot)获取并缓存 access_token → 调用微信接口生成小程序码 → 返回 base64 格式二维码 → uni-app 渲染显示。

uni-app 里不能直接调用 getwxacodeunlimit,必须走服务端
小程序码(带参数的二维码)生成接口 getwxacodeunlimit 是微信服务器严格校验的后端接口,access_token 有效期短、需 HTTPS 请求、要求 IP 白名单,uni-app 前端(哪怕在小程序环境)无法安全发起该请求。任何试图在 onLoad 或 methods 中用 uni.request 直连微信 API 的做法,都会因缺少合法 access_token 或域名未备案而失败。
正确路径只有一条:uni-app 发起请求 → 自建服务端(如 Spring Boot / Node.js) → 获取缓存的 access_token → 调用微信 https://api.weixin.qq.com/wxa/getwxacodeunlimit → 返回 base64 或临时文件 URL → uni-app 渲染 <image></image>。
- 服务端必须实现
access_token自动刷新与 Redis 缓存(避免每请求都重拉,否则极易触发频率限制) - 微信要求
scene参数是字符串且长度 ≤ 32 字节(不是 JSON!),如需传多个字段,得拼接或 Base64 编码后再截断 - 返回的二进制流建议转为
data:image/png;base64,...格式,避免额外静态资源托管和跨域问题
服务端 Java 示例:Spring Boot 调用 getwxacodeunlimit 并返回 base64
核心逻辑在 WechatQRCodeService.java 中,关键点不是“能发请求”,而是“怎么稳住 token”和“怎么处理 scene”:
-
scene必须 URL-safe:传"uid=123&pid=456"会失败,应先URLEncoder.encode("uid=123&pid=456", "UTF-8")再塞入 - 微信返回的是 PNG 二进制流,用
Base64.getEncoder().encodeToString(responseBody)转成字符串 - 响应体结构建议统一:
{"code":0,"data":"data:image/png;base64,..."},前端直接赋值给qrCodeUrl - 别忽略
page参数:必须是小程序已配置的页面路径(如"pages/index/index"),不存在会返回 41001 错误
示例请求体(POST JSON):
{ "scene": "aWQ9MTIzJmNvZGU9YWJj", "page": "pages/detail/detail", "width": 430, "auto_color": false }
uni-app 前端怎么安全传参并展示?注意 onLoad 解析陷阱
扫码进入时,微信会把 scene 拼在 URL 后作为 q 参数,但这个 q 是被 URL 编码过的字符串,不是原始 scene 值。比如你传了 scene="uid%3D123",options.q 拿到的是 "uid%3D123",不是 "uid=123"。
- 必须用
decodeURIComponent(options.q)解一次,才能拿到真实内容 - 如果 scene 是 Base64 编码过的(推荐),解完再
atob()一次,如:atob(decodeURIComponent(options.q)) - 别在
onLoad里直接console.log(options)就以为拿到原始值 —— 微信开发者工具模拟扫码时,q是 raw string;真机扫码时,它可能多一层编码 - 页面路径带 query(如
pages/detail/detail?id=1)和 scene 参数共存时,优先以options.q为准,options.id是直连参数,二者逻辑要分开处理
容易被忽略的坑:宽高设置、透明底、真机 canvas 渲染错乱
即使服务端返回了正确的 base64,uni-app 在不同平台渲染仍可能出问题:
-
width和height必须一致(微信要求正方形),且建议 ≤ 430px;设成500可能导致 iOS 真机模糊或安卓截断 -
auto_color: true会让小程序码自动适配深色模式,但 uni-app 的<image></image>默认不支持透明背景,若需白底,服务端请求加"is_hyaline": false(注意字段名是is_hyaline,不是hyaline) - 某些 HBuilderX 版本 + 微信基础库组合下,
<image :src="qrCodeUrl"></image>在 onShow 里更新会闪一下或空白 —— 改用v-show控制显隐,而非v-if - 调试时别只看开发者工具:真机扫码进来的
options.q长度可能比模拟器长(含额外符号),务必用console.log(JSON.stringify(options.q))查看原始字符串
最麻烦的其实是缓存失效链路:access_token 过期 → 服务端没及时刷新 → 返回 40001 → 前端显示空白图 → 用户以为功能坏了。token 刷新逻辑必须有日志+告警,不能只靠 try-catch。











