uni.getUserProfile 已失效,必须改用 open-type="chooseAvatar" 和 type="nickname":前者通过按钮触发原生头像选择器获取临时 avatarUrl,后者在输入框键盘顶部唤出昵称快捷选项,均需用户主动操作且及时上传处理。

uni.getUserProfile 已失效,别再用它了
微信在2021年4月起全面停用 wx.getUserInfo,2023年起又逐步限制 uni.getUserProfile 的可用性;到2026年,该接口在真机和正式版中基本无法返回真实昵称/头像,仅调试器可能“侥幸”成功。这不是你配置错了,是微信彻底关闭了这条通道。
- 调用
uni.getUserProfile后弹出授权框,用户点“允许”,但res.userInfo里avatarUrl和nickedName为空或为默认值 - 控制台无报错,但数据拿不到——这是典型“接口被灰度降权”现象,不是 Bug,是策略
- 必须改用微信官方认证的替代方案:
open-type="chooseAvatar"和type="nickname"
button open-type="chooseAvatar" 怎么写才不白点
这个按钮不是摆设,它触发的是微信原生头像选择器,返回的是带有效期(约2小时)的 HTTPS 临时链接,必须立刻处理,否则后续上传会失败。
- 必须用
<button></button>标签,<view></view>或<image></image>包裹无效 -
@chooseavatar是 Vue 事件名,不是@bindchooseavatar(旧文档常见错写) - 回调里的头像地址在
e.detail.avatarUrl,不是e.detail.userInfo.avatarUrl - 示例关键代码:
<button open-type="chooseAvatar" @chooseavatar="onChooseavatar"><image :src="avatarUrl" /></button>
onChooseavatar(e) { this.avatarUrl = e.detail.avatarUrl; }
input type="nickname" 输入框为什么没反应
它不会自动填入昵称,也不会弹窗提示;它的作用是「在微信键盘顶部唤出昵称快捷选项」,用户需主动点击键盘上的昵称条才能插入——这点极易误解。
- 必须是
<input>,<textarea></textarea>不支持type="nickname" - 用户未点击键盘昵称条时,
v-model或@blur拿到的是空值或手动输入内容,不是微信昵称 - 推荐监听
@confirm或@blur,而非@input(后者在键盘弹出瞬间就触发,不可靠) - 示例:
<input type="nickname" v-model="nickname" @blur="onNicknameBlur" placeholder="点这里选微信昵称" />
拿到 avatarUrl 后马上传到后端,别存本地
微信返回的 avatarUrl 是临时 CDN 链接,2 小时内失效,且不能直接用于小程序 <image></image> 的 src(部分基础库版本会拦截跨域请求)。不上传就等于没拿到。
- 别用
uni.downloadFile再转存——多余且可能失败;应直接用uni.uploadFile上传该 URL 到你自己的服务器 - 后端需通过 HTTP GET 请求下载该临时链接,再保存为永久地址(微信不提供直传 token)
- 若只存前端变量,下次进页面就变空白;真机测试时尤其明显
- 注意:上传前检查
avatarUrl是否为空字符串,避免传空文件导致后端报错


















