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,结合用户授权返回的encryptedData
和 iv
,以及我们服务端得到的AppID
、AppSecret
,使用前文提到的解密函数就可以获取用户的UnionID了。获取用户基本信息和头像可通过wx.getUserInfo()
方法实现。
本文主要为大家介绍了在小程序中获取UnionID、昵称、头像信息的方法。此外,获取用户信息的授权也是小程序开发中必不可少的一部分,需要注意授权的情况,在用户授权后才能获取相应的信息。