Closed zhaokun78 closed 6 years ago
你好,你说的 index.js
是哪个文件?
@zhaokun78 ERR_IN_DECRYPT_DATA这个解密错误,似乎是由过期seesion_key造成的,说来也奇怪:
这个过程似乎很正常,但是每五到十分钟调用一次,能稳定复现解密失败的问题,问题在于session_key未过期的情况下,第三部用新的code换取到的session_key似乎是无效的,导致第四步解密失败。 解决方法就是通过checkSession结果来判断是否需要重新换取新的session_key
@jas0ncn wafer2-startup/client/pages/index/index.js,是指这个
@90arther 谢谢关注。但目前,就拿 wafer2-startup demo 来说,checkSession() 其实是不生效的。把 demo 跑起来,点击“登录”---“清除登录会话”---“登录”,此时提示的“登录成功”是代码第 97 行提示的,也就是这一部分代码: wx.checkSession({ success: function () { // 登录态未过期 showSuccess('登录成功'); console.log('登录成功', userInfo); }, 可见, checkSession() 是无效的
@90arther 或者,换句话说,点击“清除登录会话”按钮时调用的 clearSession() 方法是无效的
@jas0ncn 能否协助解决一下?
腾讯改这个登录机制吧,出了问题就不管了,还想让人继续开发小程序吗?
这个问题我们正在处理,可能需要修改后端的 SDK,所以在评估问题
client/vendor/wafer2-client-sdk/lib/request.js 第 77 行:if (requireLogin) { 感觉不太对吧?
你说的不太对是什么意思?
你把 client/pages/index/index.js 第 115 行:login: true 设为 false 看看 client/vendor/wafer2-client-sdk/lib/request.js 第 78 行:var session = Session.get() 应该是必须要检查的,不应该是只有 login 为 true 时才检查的
login 的意思是是否带登录态,如果 false 就不带了,header 就不需要 skey
对于 login 参数的理解,结合文档的说明,我的理解并不是“login 的意思是是否带登录态,如果 false 就不带了”,文档:https://github.com/tencentyun/wafer2-client-sdk/blob/master/README.md#request 中对 login 参数的说明是:”是否自动登录以获取会话,默认为 false“,说明如果为 false,代表当有会话时则使用当前会话而不登录,如果没有会话则会报错。 况且这才应该是 qcloud.request 存在的意义,qcloud.request 方法的作用就是让请求带会话,这也是和 wx.request 的区别。
研究最新的 demo ,发现一些问题: (1)index.js 第93 行 wx.checkSession,我觉得是没有效果的,证据就是首先点击“登录”成功登录后,再立即点击下方的“清除登录会话”按钮,然后再点“登录”,此时 wx.checkSession 本应返回 fail,可实际上返回的始终是 success
(2)index.js 第 167 行 login: true,按我的理解,根据接口调整公告:“为优化用户体验,使用 wx.getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持。”,如果 167 行 login 设为 true,那么最终还是会调用 wx.getUserInfo,demo 这么做,岂不是与接口调整相矛盾吗?
(3)尝试将第 167 行 login 设为 false,再运行 demo。首先按(1)所述点击“登录”—“清除登录会话”—-“登录”,可以想象,此时提示的登录成功是假的;此时再点击“请求”进行验证,可以看到此时程序报错: Cannot read property 'skey' of null;at pages/index/index page doRequest function
(4)综上所述,既然 wx.checkSession 是没有效果的,那么就把它注释掉,让每一次点击“登录”都真的去登录。于是修改 bindGetUserInfo,将 wx.checkSession 部分代码注释掉,只保留如下代码: qcloud.clearSession(); // 登录态已过期,需重新登录 var options = { encryptedData: e.detail.encryptedData, iv: e.detail.iv, userInfo: userInfo } that.getWxLogin(options);
(5)新的问题出现了,这样修改后在模拟器中按照反复点击“登录—请求”的次序多次测试都是没有问题的,可是当进行真机远程调试时,第一次点击登录按钮时报错: ERR_IN_DECRYPT_DATA Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 再次点击登录按钮则不再报错,一切恢复正常
(6)总结一下: (6-1)我觉得 wx.checkSession() 是没有效果的 (6-2)index.js 第 167 行, login 参数设为 true,我认为这与接口调整所传达的信息不相符。此参数是否将继续保留,需要给一个结论 (6-3)真机中运行时报的 ERR_IN_DECRYPT_DATA 错是什么原因,为何仅第一次报错,如何解决?