一、用的的两个方法
1.通过login获取用户凭证code
wx.login({
success (res) {
let code = res.code
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
2.通过getUserInfo获取用户信息
getUserInfo: function (e) {
wx.getUserInfo({
success: res => {
let rawData = res.rawData
let signature = res.signature
let encryptedData = res.encryptedData
let iv = res.iv
}
}, err => {
})
}
二、授权登录需要的参数
后端接口需要方法1中的code和方法2中的rawData、signature、encryptedData和iv
三、注意点
1.login方法获取的code有效期是五分钟,而且只能使用一次,获取授权登录需要的参数的时候要先调用login方法获取code,然后再调用getUserInfo获取rawData等参数
2.getUserInfo这个方法只有用户授权之后才能调用,而且小程序api首次获取用户信息授权的时机换成了<button open-type="getUserInfo"/>
这种方法,但是这样的话 login方法的调用时机就是个问题,网上也有很多反应这种情况的,我的解决方法是,在getUserInfo方法回调里面调用一下login方法,然后在login方法的成功回调里再调用wx.getUserInfo方法就行了
四、复制上我的全部代码
1.html
<button open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 您尚未登录,请点击登录 </button>
2.js
getUserInfo: function (e) {
let that = this
if (e.detail.errMsg == "getUserInfo:fail auth deny")
return
wx.login({
success(resCode) {
//因为执行到这个方法体肯定是用户授权通过了 所以可以执行wx.getUserInfo
wx.getUserInfo({
success: res => {
let url = "自己的服务端地址"
let param = {
"code": resCode.code,
"rawData": res.rawData,
"signature": res.signature,
"encryptedData": res.encryptedData,
"iv": res.iv
};
//自己封装的网络请求工具类
util._get(url, param, res1 => {
if (res1.data.code == 200) {
//将sessionId存到本地 后期网络请求可以放到header里作为用户标识
wx.setStorageSync("sessionId", res1.data.data.sessionId)
that.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
} else {
wx.showToast({
title: '登录失败',
icon: 'none',
duration: 1000
})
}
}, err => {
wx.showToast({
title: JSON.stringify(err),
icon: 'none',
duration: 1000
})
})
}
})
}
})
}
当时这个问题用了很长时间才找到解决方法,刚开始是先调用的getUserInfo然后再调用的login导致服务端解密失败,因此小程序文档一定要阅读仔细,方法的调用顺序以及注意事项都要看明白。如果你有更好的解决方法,可以留言一起探讨