2021年4月12之后微信小程序使用getUserProfile替换了原来的getUserInfo接口,一些前后端的逻辑也要做相应的修改,来一起写一下最新的微信小程序登录的最佳实践吧
<button open-type="getUserInfo"/>
将不再弹出弹窗,直接返回匿名的用户个人信息,获取加密后的openID、unionID数据的能力不做调整。开始之前,想先提一下最容易遇到的两个问题:
使用Promise串行执行保证顺序。
wx.getUserProfile和wx.login封装了成两个promise
wxGetUserProfile: function () {
return new Promise((resolve, reject) => {
wx.getUserProfile({
lang: 'zh_CN',
desc: '用户登录',
success: (res) => {
resolve(res)
// res.encryptedData,
// res.iv
},
// 失败回调
fail: (err) => {
reject(err)
}
})
})
},
wxSilentLogin: function () {
return new Promise((resolve, reject) => {
wx.login({
success (res) {
resolve(res.code)
},
fail (err) {
reject(err)
}
})
})
},
在wxml中绑定元素的tap事件
<view bindtap="wxLogin">微信登录</view>
在wxLogin中使用Promise.all来保证顺序性
wxLogin:function (e) {
// 注意,一定要用这种把函数定义成变量的方式,不要直接用,否则就会出现[getUserProfile:fail can only be invoked by user TAP gesture]的错误
let p1 = wxSilentLogin()
let p2 = wxGetUserProfile()
p1.then(code => {
return code
}).then(code => {
return new Promise((resolve, reject) => {
p2.then(res => {
resolve({code, iv: res.iv, encryptedData: res.encryptedData})
}).catch(err => {
reject(err)
})
})
}).then(res => {
// 请求服务器
wx.request({
url: 'https://viencoding.com/api/v1/wx/login',
method: 'post',
data: {
code: res.code,
encrypted_data: res.encryptedData,
iv: res.iv
},
header: {
'content-type': 'application/json' // 默认值
},
success (res) {
console.log(res.data)
}
})
}).catch((err) => {
console.log(err)
})
}
而服务端,通过code获取sessionkey,再用sessionkey和iv去解密encryptedData就可以获取到用户信息了。
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/300有用( ̄▽ ̄)/
楼主你好 为什么我们后端说获取到的code已经被用过啦