问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 微信小程序 Bug getPhoneNumber 客户端 6.5.3 2.0.0
说下思路:获取电话号码的时候先checkSession,如果未登录过,则执行fail流程,执行wx.login()获取到code,用code换session_key,将换到的session_key,code一并放入缓存(放入缓存的原因是因为登录态存在的话调用wx.login会刷新session_key导致解密失败-40001,所以我的解决方法是放入缓存),处于登录态的直接从缓存直接取session_key和code,调用getWxphone()后端接口去换取手机号。。。。 看上去好像都没什么问题,但是 但是 在微信小程序发布新版本迭代的时候问题来了,新版本是没有缓存的,但是登录态存在,这就导致checkSession走success流程,直接从缓存读取code和session_key是读取不到的,解密失败。。。 这个要怎么解决?纠结了很久 没想到好的解决方法
代码如下:
(此处省略了获取code和获取session具体方法)
getPhoneNumber: function(e) {
if (e.detail.errMsg == "getPhoneNumber:fail user deny") {
wx.showToast({
title: '您取消了授权',
image: '../../images/warn.png'
})
return;
}
var that = this;
that.setData({
iv: e.detail.iv,
encryptedData: e.detail.encryptedData
});
wx.checkSession({
success: function(res) {
console.log("处于登录态");
wx.showLoading({
title: '登录中',
})
//处于登录态直接将使用data里面的code和session_key(从缓存中获取设置到data里面)
//用code和session_key换取手机号
that.getWxphone()
.then(function(res) {
if (res.data.data) {
wx.hideLoading();
app.globalData.userInfo = res.data.data;
wx.redirectTo({
url: '../userCenter/userCenter',
})
}
})
},
fail: function(res) {
console.log("需要重新登录");
wx.showLoading({
title: '登录中',
})
wx.login({
success: function(res) {
that.setData({
code: res.code
});
//将code设置到缓存里(onload时候从缓存中获取)
wx.setStorageSync('code', res.code);
//用code换session_key
that.getWxSessionKey()
.then(function(res) {
//将session_key设置到缓存
wx.setStorageSync('session_key', res.session_key);
//获取手机号
return that.getWxphone();
})
.then(function(res) {
if (res.data.data) {
wx.hideLoading();
app.globalData.userInfo = res.data.data;
wx.redirectTo({
url: '../userCenter/userCenter',
})
}
})
})
}
})
微信小程序开发问题解答
微信小程序开发者回答:
你的设计流程有问题,把sessionkey不要存在前端,保存在数据库.
code去后台能换取到这个用户openid和sessionkey,openid为条件每次都去更新sessionkey
全部都在后台,也就不会存在前台没有sessionkey,这样也安全
希望能帮到你
微信小程序开发者回答:
现在先不考虑安全的问题,现在问题是时常解密失败-41003,怎么解决
微信小程序开发者回答:
解密失败...不是sessinkey过期了,或者腾讯那边服务器不正常
本文网址:http://www.91bianli.com/weixinxiaochengxu/34395.html