目录

微信小程序开发系列-04获取用户图像和昵称

微信小程序开发系列-04获取用户图像和昵称

微信小程序开发系列目录

本文目录

前言

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代,我的运气不是很好,从第一个“版本”开始尝试,这篇文章也是记录下这个过程,以便其他新手能快速找到解决方案。

Gen1-getUserInfo

第一个“版本”是通过getUserInfo来实现。getUserInfo具体的使用方式有两种。

方式一:wx.getUserInfo

wx.getUserInfo(Object object)

该接口的功能是 获取用户信息。需要特别说明的是,在该接口的官方文档的开头就特别说明了 用户头像昵称获取规则已调整

https://i-blog.csdnimg.cn/blog_migrate/29249b6ec62f767938889254f4ef9a3f.png

根据 描述,该接口成功调用会返回UserInfo信息。

https://i-blog.csdnimg.cn/blog_migrate/dac96e90002957daf37902723e24f7e2.png

接下来看看UserInfo类型的 ,总共有7个属性。

https://i-blog.csdnimg.cn/blog_migrate/1ad71e137f3873d554cc8bf1bd325f1a.png

2021-02-24 官方发布的 , 回收wx.getUserInfo接口可获取用户个人信息能力4月28日24时后发布的新版本小程序,开发者调用wx.getUserInfo或将不再弹出弹窗,直接返回匿名的用户个人信息,获取加密后的openID、unionID数据的能力不做调整。

https://i-blog.csdnimg.cn/blog_migrate/1fba277d0f55f99b8e25b4b15e32d829.png

即wx.getUserInfo接口的返回参数不变,但开发者获取的userInfo为匿名信息。

显然2021年4曰28日之后,这种方式就不能获取到 昵称和头像啦!

我也实际验证了下,结果如下:

https://i-blog.csdnimg.cn/blog_migrate/e3c6b564cb0e8020255e79f4d328b993.png

https://i-blog.csdnimg.cn/blog_migrate/a9f4363fe16d6a79a3951d83b8d5d633.png

方式二:button open-type=“getUserInfo”

为了保持文章的完整性,也给出使用button getUserInfo的示例。创建一个info页面,info.wxml只有button、image、text三个组件,当点击“获取头像昵称”按钮后,将获取到的nickName和avatarUrl显示到text和image。

https://i-blog.csdnimg.cn/blog_migrate/aae0d1c1c0aac651d5ff8404510e12e2.png

https://i-blog.csdnimg.cn/blog_migrate/5bd67421796c0d3f6b2f9ac7c9c619a3.png

https://i-blog.csdnimg.cn/blog_migrate/928ce44918f4c4fa0bee08ec2fdcf88e.png

从运行结果可以看出,nickName和avatarUrl都是匿名且其他的5个属性都为“空”。

Gen2-getUserProfile

object.success 回调函数
参数
Object res
属性类型说明最低版本
userInfo用户信息对象
rawDatastring不包括敏感信息的原始数据字符串,用于计算签名
signaturestring使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见
encryptedDatastring包括敏感数据在内的完整用户信息的加密数据,详见
ivstring加密算法的初始向量,详见
cloudIDstring敏感数据对应的云 ID,开通 的小程序才会返回,可通过云调用直接获取开放数据,详细见

在这边 中,建议使用 新增getUserProfile接口 获取用户的个人信息(头像、昵称、性别与地区),该接口从基础库2.10.4版本开始支持。于是我按照官方的说法继续实验。

查看getUserProfile接口的 ,发现又有一个 。

https://i-blog.csdnimg.cn/blog_migrate/dc6fd34e7c9d7491a8deb2f5c7c86ba4.png

https://i-blog.csdnimg.cn/blog_migrate/86d1e3556e3fa10a92670e53f631e2f6.png

自2022年10月25日后,通过wx.getUserProfile接口获取用户头像和昵称 又不支持了。但旧的基础库版本(2.10.4~2.27.0)可以支持,于是我继续试验。。。

我将基础库版本改成2.16.1。

https://i-blog.csdnimg.cn/blog_migrate/110aa4eb759f8a913f4dfd8871c63646.png

然后运行代码,真的可以弹窗了。

https://i-blog.csdnimg.cn/blog_migrate/966b24592f2fe9b25054450947c43dac.png

点击“允许”按钮后,avatarUrl和nickName能正常获取并显示啦!

https://i-blog.csdnimg.cn/blog_migrate/ddac055743760363fc2ad7c3e7c70863.png

至此,获取用户头像和昵称的目的算是满足了,但还是有点瑕疵,基础库的版本比较低。于是我又想试试最新的基础库版本,看效果如何?将基础库版本改为3.2.5。

https://i-blog.csdnimg.cn/blog_migrate/258d76060296096f742894262894599d.png

然后再次运行,获取不到用户头像和昵称了,不开心。

https://i-blog.csdnimg.cn/blog_migrate/d80d18c70e82a453efc2bc1738eed98f.png

说明通过wx.getUserProfile的方法也不是最优方案。那怎么搞呢?

答案在 :

https://i-blog.csdnimg.cn/blog_migrate/28e63dc662c4a9308ef497fa4547e169.png

Gen3-chooseAvatar&nickname

button open-type=“chooseAvatar"与input type=“nickname"方案。

头像选择

需要将 组件 open-type 的值设置为 chooseAvatar ,当用户选择需要使用的头像之后,可以通过 bindchooseavatar 事件回调获取到头像信息的临时路径。

昵称填写

需要将 组件 type 的值设置为 nickname ,当用户在此input进行输入时,键盘上方会展示微信昵称。

如下图,点击灰色图像后,会弹框让我选择“用微信头像”。

https://i-blog.csdnimg.cn/blog_migrate/cc2b9f6f6f5f3c3cbd8892b6963d96b0.png

点击“用微信头像”后,效果如下,接着再单击昵称输入框,会弹出“用微信昵称”,继续选择这个。

https://i-blog.csdnimg.cn/blog_migrate/75d2aba6123f4805b14964e7402b90bf.png

整个获取头像和昵称的效果就是这样子的。

https://i-blog.csdnimg.cn/blog_migrate/ece71828125490aed4f654f518878088.png

<view data-weui-theme="{{theme}}">
  <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
    <image class="avatar" src="{{avatarUrl}}"></image>
  </button> 
  <mp-form>
    <mp-cells>
      <mp-cell title="昵称">
        <input type="nickname" class="weui-input" placeholder="请输入昵称"/>
      </mp-cell>
    </mp-cells>
  </mp-form>
</view>
const app = getApp()
const defaultAvatarUrl = 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'
Page({
  data: {
    avatarUrl: defaultAvatarUrl,
    theme: wx.getSystemInfoSync().theme,
  },
  onLoad() {
    wx.onThemeChange((result) => {
      this.setData({
        theme: result.theme
      })
    })
  },
  onChooseAvatar(e) {
    const { avatarUrl } = e.detail 
    console.log("chooseAvatar:", e)
    this.setData({
      avatarUrl,
    })
  }
})

总结

从上述“三个版本”的迭代来看,Gen3的方式更合理,也更安全。虽然按照Gen3的方式能且仅能获取头像和昵称,但是用户并没有真正的登录。接下来再研究下怎么登录。