小程序开发之获取用户UnionID、昵称、头像信息的方法

1. 前言

随着小程序的逐渐普及,很多开发者都在寻求一些实用、高效且符合小程序开发规范的技巧。日常开发中,我们需要获取用户基本信息,如UnionID、昵称、头像等,来了解用户信息,或者进行审核等操作。本文将介绍如何在小程序中获取用户的UnionID、昵称、头像信息。

2. 获取UnionID及用户信息的前提

想要从小程序后端获取用户UnionID、昵称或头像信息,前提是用户需授权小程序获取其以下指定openid对应的用户唯一标识(UnionID)并且拥有相应的访问权限。

2.1. 用户信息授权

可以使用小程序的wx.getUserInfo()API来获取用户信息。 在小程序中,可以通过 按钮或者组件获取用户信息。

如果用户同意授权,小程序会给出用户的信息,包括用户的昵称和头像。通过该API获取的数据结构如下:

{

userInfo: {

nickName: string, //用户昵称

avatarUrl: string, //用户头像路径

gender: number, //用户性别(1为男性,2为女性)

province: string, //用户所在省份

city: string, //用户所在城市

country: string, //用户所在国家

language: string, //用户使用的语言

},

rawData: string, //不包括敏感信息的原始数据字符串,用于验证用户信息

signature: string, //使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息

encryptedData: string, //包括敏感数据(加密后的 UnionID)的数据字符串,解密后为一个 JSON 结构

iv: string //加密算法的初始向量,解密后为一个 JSON 结构

}

其中,encryptedData字段是加密后的UnionID,需要解密才能获取UnionID。上述三个字段如果需要使用,需要授权访问用户的个人信息。

为此,在小程序中,用户的基本信息包括User OpenID及其 UnionID的获取需要用户单独确认授权。可以在进行授权的时候设置一些需要授权的项目,设置方式如下:

wx.getUserInfo({

// 需要先调用 wx.login 接口,可以获取 code

success (res) {

const userInfo = res.userInfo

const nickName = userInfo.nickName

const avatarUrl = userInfo.avatarUrl

const gender = userInfo.gender // 性别 0:未知、1:男、2:女

const province = userInfo.province

const city = userInfo.city

const country = userInfo.country

}

})

3. 获取UnionID及用户信息的方法

在已经授权的情况下,可以通过如下方式获取用户的UnionID、昵称、头像等信息:

3.1. 根据code获取sessionKey

首先,我们需要使用小程序提供的wx.login()API来获取用户登录态信息,其中返回的code是我们后续用于换取用户登录态的临时code。

实现代码如下:

wx.login({

success: function(res) {

if (res.code) {

// 发起网络请求

wx.request({

url: 'https://example.com/onLogin',

data: {

code: res.code

}

})

} else {

console.log('登录失败!' + res.errMsg)

}

}

});

3.2. 获取UnionID

有了sessionKey就可以将encryptedData提供给小程序直接解密出来了。

以下为解密函数的实现方式:

function decrypt(encryptedData, iv, sessionKey) {

// base64 decode

const sessionKeyDecode = Buffer.from(sessionKey, 'base64')

encryptedData = Buffer.from(encryptedData, 'base64')

iv = Buffer.from(iv, 'base64')

try {

// 解密

const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKeyDecode, iv)

// 设置自动 padding 为 true,删除填充补位

decipher.setAutoPadding(true)

let decoded = decipher.update(encryptedData, 'binary', 'utf8')

decoded += decipher.final('utf8')

decoded = JSON.parse(decoded)

return decoded.unionId

} catch (err) {

console.error(err)

return null

}

}

3.3. 获取昵称及头像

获取用户基本信息及头像的方法与获取UnionID类似,也是通过wx.getUserInfo()或者用户池API来实现,具体可参照下面的代码:

wx.getUserInfo({

success: function (res) {

console.log(res.userInfo)

console.log(res.userInfo.nickName)

console.log(res.userInfo.avatarUrl)

}

})

4. 小结

通过wx.login() 所获取的code,结合用户授权返回的encryptedDataiv,以及我们服务端得到的AppIDAppSecret,使用前文提到的解密函数就可以获取用户的UnionID了。获取用户基本信息和头像可通过wx.getUserInfo()方法实现。

本文主要为大家介绍了在小程序中获取UnionID、昵称、头像信息的方法。此外,获取用户信息的授权也是小程序开发中必不可少的一部分,需要注意授权的情况,在用户授权后才能获取相应的信息。