微信小程序平台运营时,要获取获取用户的基本信息,是需要用户授权的,而这种授权获取的开发,需要调用wx.login接口、login接口等。本文针对小程序用户基本信息获取的问题,说一下一些要注意的内容,并提供一些示例代码供大家参考。
1、用户授权与用户信息获取
(1)获取用户信息
当 withCredentials 为 true 时,要求调用wx.login接口,或者此前已经调用过且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData, iv 等敏感信息。
(2)用户授权,scope.userInfo。
wx.getUserInfo({
withCredentials//是否带上登录态信息
lang//指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。默认为en。
success: function(res) {//接口调用成功的回调函数
var userInfo = res.userInfo//用户信息对象,不包含 openid 等敏感信息
var userInfo = res.userInfo
var nickName = userInfo.nickName
var avatarUrl = userInfo.avatarUrl
var gender = userInfo.gender //性别 0:未知、1:男、2:女
var province = userInfo.province
var city = userInfo.city
var country = userInfo.country
res.rawData//不包括敏感信息的原始数据字符串,用于计算签名
res.signature//使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息
res.encryptedData//包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
res.iv//加密算法的初始向量,详细见加密数据解密算法
},
fail/complete: function(){//接口调用失败/结束的回调函数
}
})
encryptedData 解密后为以下 json 结构,详见加密数据解密算法
{
"openId": "OPENID",
"nickName": "NICKNAME",
"gender": GENDER,
"city": "CITY",
"province": "PROVINCE",
"country": "COUNTRY",
"avatarUrl": "AVATARURL",
"unionId": "UNIONID",
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}
2、getPhoneNumber(OBJECT)
(1)说明
getPhoneNumber(OBJECT)即获取微信用户绑定的手机号,需先调用login接口。这是因为在获取微信用户绑定的手机号时,是需要用户主动去触发才能发起获取接口,所以这个用户信息获取的功能不能由API接口来调用,需要用点击组件来触发。
(2)使用方法
获取用户绑定的手机号时,需要将组件open-type的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据,然后在第三方服务端结合 session_key 以及 app_id,通过解密而获取手机号。
3、注意点
在回调中调用wx.login登录,可能会刷新登录态。此时服务器使用code换取的sessionKey并不是加密时使用的sessionKey,所以会导致解密失败。在这里我们建议开发者可以提前进行login,或者在回调前先使用checkSession进行登录态检查,以免login刷新登录态而导致解密失败。示例代码如下:
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"> </button>
Page({
getPhoneNumber: function(e) {
console.log(e.detail.errMsg)
console.log(e.detail.iv) //加密算法的初始向量,详细见加密数据解密算法
console.log(e.detail.encryptedData) //包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
}
})
encryptedData 解密后为以下 json 结构,详见加密数据解密算法
{
"phoneNumber": "13580006666", //用户绑定的手机号(国外手机号会有区号)
"purePhoneNumber": "13580006666", //没有区号的手机号
"countryCode": "86",//区号
"watermark":
{
"appid":"APPID",
"timestamp":TIMESTAMP
}
}