open-type="chooseavatar"是唯一合规方式:微信2.21.2起废弃wx.getuserprofile头像获取,须用button绑定@chooseavatar事件;input需用type="nickname";临时avatarurl须立即上传至服务器并存储永久url;manifest.json中必须配置正确appid和scope.userinfo权限。

open-type="chooseAvatar" 是唯一合规方式
微信从基础库 2.21.2 起彻底废弃 wx.getUserProfile 获取真实头像的能力,新版本小程序提交审核后,调用该接口只会返回灰色默认头像和“微信用户”昵称。现在必须用 button 的 open-type="chooseAvatar" 属性——这是目前唯一能拿到用户真实头像 URL 的官方路径。
注意两点:
-
chooseAvatar是事件名,绑定时写@chooseavatar(全小写,无驼峰),不是@chooseAvatar,否则监听无效 - 该能力仅在微信小程序平台生效,
#ifdef MP-WEIXIN条件编译必须加,否则 H5 或 App 端运行会报Unknown event handler property - 用户点击按钮后弹出的是微信原生选择器,不能自定义 UI,也不能跳过——这是微信强制的交互链路
type="nickname" 输入框才是真昵称入口
别再用 input 普通输入 + 手动填了。微信提供了原生支持:type="nickname" 的 input 组件会在软键盘上方显示当前用户的微信昵称,用户可一键选择或编辑。这是目前唯一能稳定获取用户主观认可昵称的方式。
常见误区:
- 写成
type="text"+v-model模拟,结果用户输错、输空、输乱码,还误以为是“授权失败” - 没监听
@blur或@change,导致值没同步到 data,后续上传为空字符串 - 未做长度校验,微信允许昵称含 emoji 和空格,但后端接口可能拒收超长或非法字符,建议前端用正则
/^(?! *$)[\s\S]{1,20}$/控制
临时路径不上传 = 几分钟后变空白
onChooseAvatar 回调里拿到的 e.detail.avatarUrl 是个临时 HTTPS 地址,有效期极短(通常 1–5 分钟),且无法跨会话复用。你看到头像“显示正常”,不代表它能存住——页面刷新、切后台再回来、甚至等几分钟,大概率变成 404。
必须立刻上传:
- 不要只存到
this.avatarUrl就完事,得调uni.uploadFile把文件流发到自己服务器 - 别依赖
avatarUrl直接当 CDN 地址用,那是微信的临时资源托管,不是你的存储 - 上传成功后,把服务端返回的永久 URL 存进用户 profile,后续所有头像展示都用这个地址
manifest.json 和权限配置漏一项就白写
代码写得再对,如果 manifest.json 里没配好,照样拿不到头像和昵称。两个关键点必须核对:
-
"mp-weixin": {"appid": "your-real-appid"}—— 必须填正式小程序 AppID,测试号或未备案的 AppID 返回的全是占位数据 -
"permission": {"scope.userInfo": {"desc": "用于完善用户资料"}}—— 这段必须存在,且desc字符串不能空,否则提审被拒,开发时也弹不出授权框 - 微信公众平台后台「开发管理 → 开发者工具」里,要确认基础库版本 ≥ 2.21.2,旧版真机调试可能不触发
chooseAvatar
最常被忽略的是:开发者工具模拟器有时表现正常,但真机上因基础库差异直接不回调——务必用 iOS/Android 真机+最新版微信验证。











