这是手机号正确获取的方式。
wx.checkSession({
success(){
//session_key 未过期,并且在本生命周期一直有效
//session_key还在啊
Util.consolelog('session_key还在,在哪里?')
that.getPhoneNumber(e);
},
fail(){
// session_key 已经失效,需要重新执行登录流程
wx.login({
success(res) {
if (res.code) {
e.code=res.code;
that.getPhoneNumber(e);
} else {
Util.consolelog('登录失败!' + res.errMsg)
}
}
})
}
})
再看看获取头像等的方式
GetUserProfile: function (cb) {
var that = this;
console.log('this.globalData.GetUserProfile-that', that);
console.log('this.globalData.GetUserProfile-this', that.userInfo);
if (this.userInfo) {
//typeof cb == "function" && cb(this.globalData.userInfo)
typeof cb == "object" && cb.hasgetWxInfoSuccess(that.userInfo);
} else {
//调用登录接口
wx.getUserProfile({
desc: '业务需要',
success(res){
console.log('res',res);
wx.login({
success: function (r) {
// console.log('login',r)
typeof cb == "function" && cb(that.userInfo);
try {
var s = JSON.parse(res.rawData);
} catch (e) {
var s = {};
}
var o = {
nick: s.nickName,
sex: s.gender,
avatar: s.avatarUrl,
country: s.country,
city: s.city,
code: r.code,
province: s.province,
rawdata: res.rawData,
encryptedData: res.encryptedData,
signature: res.signature,
iv: res.iv,
rc_member_id: wx.getStorageSync('rc_member_id')
};
console.log('o', o);
$.ajax({
service: 'user.wxxcxLogin',
method: 'POST',
data: o,
succ: function (res,all) {
if (res && res.token) {
$.setSession(res);
if ($.store('RECM')) {
var Partner = require("model/Partner.js");
//有推荐会员ID+当前用户是登陆用户的话,发起关联关系2019年07月26日18:48:27
Partner.RecMember.Add({
data: {
r_user_id: $.store('RECM'),
channel: $.store('RECM_CHANNEL')?$.store('RECM_CHANNEL'):'link',
channel_params: $.store('RECM_CHANNEL_PARAMS')?$.store('RECM_CHANNEL_PARAMS'):'unknow',
},
succ: function (res) {
console.log('授权登陆时,推荐成功:', recm + '推荐了' + $.store('S[MEMBER]'))
},
fail: function (res,all) {
console.log('授权登陆时,推荐失败:', all.msg);
}
})
}
cb.hasgetWxInfoSuccess(that.userInfo);
}
}
});
}
});
}
});
}
},
看到区别没有,获取头像的地方是每次都wx.login后传递了一个r.code,但是实际上如果把这个code带给后端用来解密会偶发解密失败。
原因:
你看这几个参数都是getProfile里获取的
rawdata: res.rawData,
encryptedData: res.encryptedData,
signature: res.signature,
只有code:r.code是wx.login里获取的
你能确保res.encryptedData时用到的code和wx.login时的code一致吗?不一定的,官方有说明,特别是手机号获取的时候(说wx.login时会刷新登陆态,要checksession一下,这个同样适用于getProfile)。
===
开发者如果遇到因为 session_key 不正确而校验签名失败或解密失败,请关注下面几个与 session_key 有关的注意事项。
解决方案:
1、