版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ldb987/article/details/82851421
错误描述
用户登录微信小程序,初始登录会报错,接着再登录,就会登录成功。
后端catch住的异常
抛异常原因
小程序客户端调用微信服务器的接口顺序反了。
小程序客户端需要调用微信服务器的wx.login接口来获取code,然后调用wx.getUserInfo来获取加密数据和偏移向量iv。正确的顺序应该是先调用login,然后再调用getUserInfo。
而公司代码先调用了getUserInfo获取了解密数据,然后又调用的login,就会刷新登录态,这样获取的code换取的解密秘钥和提前获取的加密数据的加密秘钥就可能不一致的,所以无法成功解密。
错误代码
//先调用了getUserInfo,获取用户信息
bindGetUserInfo: function (e) {
// console.log(e)
wx.showToast({
title: '加载中',
icon: 'loading',
duration: 3000
});
var that = this,
userInfo = e.detail,
encryptedData = userInfo.encryptedData,
iv = userInfo.iv;
//然后才调用了login
wx.login({
success: function (res) {
//用拿到的code,从后台获取sessionId
wx.request({
url: sessionID,
method: 'GET',
data: {
js_code: res.code,
movieCode: movieCode
},
header: {
"Content-Type": "application/x-www-form-urlencoded",
'Accept': 'application/json'
},
});
}
});
正确代码
//先调用login
wx.login({
success: function (res) {
//用拿到的code,从后台获取sessionId
wx.request({
url: sessionID,
method: 'GET',
data: {
js_code: res.code,
movieCode: movieCode
},
header: {
"Content-Type": "application/x-www-form-urlencoded",
'Accept': 'application/json'
},
success: function (res) {
// console.log('sessionId:');
// console.log(res.data.resultData);
// console.log(res.data.resultData);
var sessionId = res.data.resultData; //从后台获取到的sessionId
wx.setStorageSync('sessionId', sessionId);
//然后调用getUserInfo获取加密数据encryptedData和iv
wx.getUserInfo({
success: function(msg){
console.log(msg);
var encryptedData = msg.encryptedData,
iv = msg.iv;
wx.request({
url: userInfoUrl,
method: 'POST',
data: {
encryptedData: encryptedData,
iv: iv,
sessionId: sessionId
},
//代码不完整,参考者请注意。。。。
结语
这个问题搞了好几天,一直以为是后端的问题,一直再调整后端,直到快要放弃的时候,才发现,原来问题症结在此。所以,调用微信服务器接口的顺序一定是wx.login在前,wx.getUserInfo在后。