uni-app小程序端无法直接调用getwxacodeunlimit,因微信强制要求该接口仅服务端可调用,涉及access_token安全管控与域名白名单校验;扫码后scene参数需从onLoad的options.scene中解析,而非options.query。

uni-app 小程序端无法直接调用 getwxacodeunlimit 生成带参小程序码,必须走服务端中转;扫码则可直接用 uni.scanCode,但参数解析逻辑容易出错——这是两个环节里最常卡住的地方。
为什么不能在 uni-app 前端直接调 getwxacodeunlimit
微信强制要求该接口只能由后端发起,原因很实际:
-
access_token必须由服务端统一缓存和刷新(有效期仅 2 小时),前端暴露appid/secret是严重安全风险 - 请求域名必须在微信后台配置白名单,且需 HTTPS;
uni.request在小程序环境会因域名未备案或非白名单直接失败 - 线上环境必然返回
{"errcode":40001,"errmsg":"invalid credential"}或空白图,不是“没配好”,而是平台禁止 - 哪怕你本地 mock 成功,发布后扫码就是白屏或 404 —— 这不是 bug,是微信的硬性校验
服务端该怎么接 getwxacodeunlimit
你的后端需要暴露一个简单 POST 接口(比如 /api/qrcode/unlimited),接收以下参数并转发给微信:
-
scene:必须是 ASCII 字符,长度 ≤32 字节;中文/特殊字符务必先encodeURIComponent或 base64 编码 -
page:目标页面路径,如"pages/detail/detail",不能带.vue后缀 -
width:建议设为430,太小扫码识别率低,太大生成慢 - 返回值应为 base64 字符串(如
"data:image/png;base64,iVBORw..."),uni-app 直接赋给<image :src="..."></image> - 务必用 Redis 缓存
access_token,避免每请求都拉一次,否则很快触发微信频率限制
uni-app 扫码后怎么正确拿到 scene 参数
小程序扫码跳转后,参数不在 options.query,而在 options.scene —— 这是最多人写错的地方:
- 如果扫的是小程序码(
getwxacodeunlimit生成的),参数通过options.scene传入,需手动decodeURIComponent - 如果扫的是普通链接二维码(配置了「扫普通链接二维码打开小程序」),参数才在
options.query里 -
onLoad(options)中直接解构会出错:const { scene } = options→ 实际是字符串,不是对象,得先JSON.parse(decodeURIComponent(scene))或按业务约定解析 - 常见错误:把
scene=abc123当成 URL query 处理,结果得到undefined
生成本地二维码(非小程序码)用 canvas 还是插件
如果只是生成普通链接二维码(比如分享 H5 页面),不用走微信接口,uni-app 可直接 canvas 渲染:
- 推荐用
uni-qr插件,轻量、无依赖、支持自定义大小和颜色,:text传入完整 URL 即可 - 手写 canvas 的话注意:
uni.createCanvasContext创建后必须等onReady再绘图,否则 canvas 为空 - 生成的临时路径要用
uni.canvasToTempFilePath转换,返回的是本地 file:// 路径,不能直接当网络图用 - 保存到相册前记得加
uni.authorize({scope: 'scope.writePhotosAlbum'}),iOS 尤其敏感
真正麻烦的从来不是“怎么写”,而是搞清哪个参数走哪条链路、哪个 token 该谁管、哪个 scene 该在哪解——这些边界一旦模糊,调试三天也看不出问题在哪。


















