- 微信小程序授权登录第一次总是失败,第二次登录便正常了
错误流程
调用 用户点击授权用户信息按钮 ===> 调用wx.login( )生成code发送给后台生成session_key解密 ===> 用户点击授权手机号按钮
问题原因:
先获取了授权信息的 iv与encryptedData ,后 获取的 code 发送给后台生成 session_key, 然后这个session_key因为是后生成的,没有办法解密之前获取的iv, 需要先生成code给后台, 再获取iv与encryptedData, 这样 后台就可以解密了
简单说,就是前台先生成了密码,后生成的钥匙, 后面的钥匙开不了前面的锁, 必须先有钥匙,再有锁。
正确流程
正确的流程就是把第一步和第二部颠倒一下,我们可以在登录页一开始加载的时候便调用login方法去获取code
完整代码
util.racePromise是我封装的请求办法,读者使用时可以替换为wx.request()正常请求
const app = getApp();
const util = require('../../utils/util')
const proRequest = util.wxPromisify(wx.request)
Page({
data: {
//判断小程序的API,回调,参数,组件等是否在当前版本可用。
canIUse: wx.canIUse('button.open-type.getUserInfo'),
},
onLoad: function() {
this.login();
},
bindGetUserInfo: function(e) {
if (e.detail.userInfo) {
//用户按了允许授权按钮
this.setData({
iv:e.detail.iv,
encryptedData:e.detail.encryptedData
})
app.globalData.userInfo = e.detail.userInfo;
wx.setStorageSync('userInfo', e.detail.userInfo);
this.updateUserInfo();
} else {
//用户按了拒绝按钮
wx.showModal({
title: '提醒',
content: '您点击了拒绝授权,将会影响您的功能使用!',
showCancel: false,
confirmText: '返回授权',
success: function(res) {
// 用户没有授权成功,不需要改变 isHide 的值
if (res.confirm) {
console.log('用户点击了“返回授权”');
}
}
});
}
},
login(){
this.goLogin();
},
goLogin(){
wx.login({
success: res => {
util.racePromise(proRequest({
url:`${util.URL}/api/common/login`,
method:'POST',
data:{
code:res.code
}
})).then(res=>{
wx.setStorageSync('token', res.data.data.token);
}).catch(err=>{
console.log(err);
})
}
});
},
// 首次更新用户信息
updateUserInfo(e){
wx.checkSession({
success:() => {
//session_key 未过期,并且在本生命周期一直有效
util.racePromise(proRequest({
url:`${util.URL}/api/user/info`,
method:'POST',
data:{
iv:this.data.iv,
encryptedData:this.data.encryptedData
},
header:{
'Authorization':wx.getStorageSync('token')
}
})).then(res=>{
wx.showToast({
title: '登录成功!请稍等',
icon:'none'
})
setTimeout(()=>{
wx.redirectTo({
url: '../getphone/getPhone',
})
}, 500)
}).catch(err=>{
console.log(err);
})
},
fail:()=> {
// session_key 已经失效,需要重新执行登录流程
wx.showToast({
title: '登录信息过期~ 从新登录中……',
icon:'none'
})
this.goLogin();
}
})
}
})
网友评论