需求:通过微信绑定手机号弹窗,获取用户信息,带到后台
原因:sessionkey 过期了
为啥过期:与微信官方交互了两次,sessionkey 更新导致 sessionkey 不一致
最终解决思路:
具体问题:
使用框架使用的是 uni,写的是微信小程序,ul框架用的:thorui
产品要点击微信一键登录,通过获取手机号在获取用户信息存放到数据库中,刚开始我也实现了,但是每次登录的时候第一次都会失败,第二次点击就可以了,一开始我还以为是后台的问题,想要疯狂甩锅,代码实现是:在button按钮绑定事件,拿到用户信息,进行un,login,然后根据code获取sessionkey,调接口传encryptedData和sessionkey到后台进行对encryptedData解密,返回用户信息
具体实现:
对 thorul的button 进行二次封装,增加了获取手机号功能,返回的是一些encryptedData,cloudID 用户加密之后的信息,要放到后台,通过sessionkey 进行解密返回
先说一下第二套方案吧,但是他是不行的,但是我就要说:
发现了是两次sessionkey不一样了,于是在封装的button进行了处理,在button中进行的uni.login
binduserphone(data){
let userData=data
uni.login({
provider: 'weixin',
success: function(rep) {
userData.userDataLoginCode=rep
//rep中有code通过code获取sessionkey,此时与微信官方进行两次交互,但是code是最后的我以为可以解开用户信息
_this.$emit('getphonenumber', userData);
}
});
}
在这里其实是不行的
第一次与微信官方获取用户解密的信息生成了一个sessionkey
第二次通过un.login登录获取sessionkey
但是此时你的sessionkey钥匙打不开你第一次的锁,所以授权失败,当你第二次的登录的时候,你的sessionkey已经存在了,所以授权成功,**于是我有了思路,想着能不能在第一次获取加密信息的时候拿到sessionkey存起来,看了下没有相对数据,百度无果,
浏览了相关公司的小程序发现的确可以,顺丰的,享道的摩拜的都可以,但是我发现他们都有一个共同的问题就是当点击授权的时候回延迟1秒左右,于是问题解决了
解决方案:
先进行uni.login获取sessionkey在获取encryptedData传给后台,问题就解决了,
我在那个button 按钮上面加了一个tab事件,进行获取sessionkey在进行encryptedData解密,要在封装的button中加一个settimeout就好了