概要
- 在小程序开发中,获取用户信息,获取手机号基本是必须用到的功能
- 但是在有些时候会遇到小程序解密失败的问题,这多数是因为前端这边登录流程出的问题
- 会出错的流程:前端多数是把open-data的获取加密信息按钮做成登录按钮,然后点击的时候用wx.login获取code,成功后将加密信息和code传到后端直接调用解密手机号的接口,这样session_key可能没来得及刷新,从而导致解密失败,但是第二次解密一定会成功的现象
原因分析
- 出错的原因:在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。
- 解决方案:建议开发者提前进行 login;或者在回调中先使用 checkSession 进行登录态检查,避免 login 刷新登录态。
解决案例
所有解决办法是提前调wx.login,在获取手机号的回调方法中取检验登录状态,代码如下:
onLoad: function (options) {
wx.login({
success: res => {
that.setData({
code: res.code
})
}
})//先登录提前保存code
},
getPhoneNumber(e) {//触发获取手机号加密信息
let that = this,
encryptedData = e.detail.encryptedData,
iv = e.detail.iv;
wx.checkSession({
success() {
//session_key 未过期,并且在本生命周期一直有效(这里面可以不写代码)
},
fail() {
// session_key 已经失效,需要重新执行登录流程并更新code
wx.login({
success: res => {
code = res.code
that.setData({
code: code
})
}
})
},
complete() {
//将code,encryptedData,iv传给后台进行解密
}
})
}
|