- 当前 Bug 的表现(可附上截图)
看了一整天,也没找到合适的答案,现在的问题是,开发版每次登录都要登录2次,2次后重新登录都是直接登录成功,间隔一段时间后再登录又要登录2次,正式版出现这个异常情况很少。
看来数据,出现这个问题的时候session_key都是一样的,也就是说第二次也是一样的session_key能登录成功,第一次就不能,不懂为什么?
请求顺序是小程序wx.login,取到了code,iv和encryptedData,连续请求每次都是不一样的,然后使用appid和secret获取session_key、openid等信息,每次连续请求获取的session_key都是一样的。
javax.crypto.BadPaddingException: pad block corrupted
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)
at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)
at javax.crypto.Cipher.doFinal(Cipher.java:2164)
at com.xmz1.util.wx.login.WxLoginUtils.getUserInfo(WxLoginUtils.java:64)
at com.xmz1.mall.service.base.impl.UserServiceImpl.login(UserServiceImpl.java:107)
at com.xmz1.mall.controller.base.UserController.login(UserController.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
红框是出现异常的地方
我也遇到类似的问题。我这里把日志贴一下吧,也方便微信的技术找一下问题的原因。
请看下面的服务端日志:(我是做了序列化处理的,所以会有类似a:9:等字符;openid由于是敏感信息,被我删掉了;encryptedData也是敏感信息,也被我删掉了能正确解密的那两条,留着无法正确解密的两条做证据。)
首先,从日志记录时间可以看出,这4条登录请求之间相隔没多久。
其次,可以看出第2、3、4这三条日志微信端返回的signature是一模一样的。
再次,可以看出这4条日志接收到的code都是不一样的并且都能正常获取到session_key,从而证明了前端传过来的code是完全没问题的。
最后,可以看到第2、3这两条日志的session_key是一样的,而第4条日志的session_key变了。
结论:第2第3条日志的session_key一致,signature一致,并且能正确利用rawData、session_key来计算出微信返回的signature;而到了第4条日志,虽然session_key还是没有变化,signature却变化了,导致计算出来的signature和微信返回的signature不一致,必然导致数据验证失败。而最要命的是:数据验证失败的时候,用户的加密信息就必定发生解密失败的情况。最后直接导致了无法进行下一步开发。
[2018-12-12 10:15:31]用户信息不合法,请重新登录。errcode:-41003,接收到的参数:a:9:{s:4:"sign";s:0:"";s:1:"t";s:10:"1544580930";s:1:"v";s:2:"10";s:4:"code";s:32:"023Glq742TueQO0eIw742T6a742Glq76";s:4:"type";s:1:"1";s:13:"encryptedData";s:536:"kF3q0YCzix8HIppD8FMKnu+GC+rORcumaMWYDj94ukheiU6M2IAh2W2r9xxOnSH4ipHrEQhTwwrEvgMaal63ZR33uFXtR8FnjGBKCbfVALvNsCGOa7p36U0ljtnJbik/DQWi9YoTg3RtoC9EUacUBJhQJRjCUS+Iq+4O9E9SBrJRSPrdhNZQd3kvs75HHNAnzP6UL2SA2OEGXkiwRUwX0upcwA41YrocCaSwYOs7GyDZC8GO3JFpOtP1dg+CsL8yEmMy0O3vV/06IYgKsfo/FA23B3Z4jQIC2RTTCzegNVeREz9GcwGfVyI8YmQOW9gcj6XnrWdayiqEheH7QCjNC8VB7SS/Pytg32c7fTazLTsLRyeWuIDz1QIFDEdJvg8s9C/TjNacHDouhWzKBnIwhnSlFpyFI3H+F/MVVdqA46XD/kgvwQYeTqsxx/micUIRTtVXN09JV0SjnJeV5+UI+BhlVHkGsRzBD2dJYqp/ckmdE/RX5tr1xKGFKjUnK0lyz+1mDc0weqGjagf6j+wDlg==";s:9:"signature";s:40:"dbbf889a23e720bfab5edbb07ef2fb31be86b3f6";s:2:"iv";s:24:"7blTilWs8PCbLeP1M3PjyA==";s:7:"rawData";s:247:"{"nickName":"KAZUKI","gender":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/KUwFGLsK1MHqg2kDJkJCWY5rMbPP0hZZqzXZcBa0WLYoc9szTmPSuYrKv5FbHOOg1xv40sqYFaibiaFzT6ibte1Ag/132"}";},微信获取openid结果:a:2:{s:11:"session_key";s:24:"yRhjlwu4fTeVd0arZ9KTSQ==";s:6:"openid";s:28:"";}
[2018-12-12 10:18:36]用户信息合法,暂时记录用以调试。接收到的参数:a:9:{s:4:"sign";s:0:"";s:1:"t";s:10:"1544581115";s:1:"v";s:2:"10";s:4:"code";s:32:"033dfteH1V3rQ00850eH1tUjeH1dfteG";s:4:"type";s:1:"1";s:13:"encryptedData";s:536:"";s:9:"signature";s:40:"f0a032dadfcea3108bfb000f8e2d4b39a31458a1";s:2:"iv";s:24:"Zh8RDbkFYQk0WGhY4qbyWQ==";s:7:"rawData";s:247:"{"nickName":"KAZUKI","gender":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/KUwFGLsK1MHqg2kDJkJCWY5rMbPP0hZZqzXZcBa0WLYoc9szTmPSuYrKv5FbHOOg1xv40sqYFaibiaFzT6ibte1Ag/132"}";}微信获取openid结果:a:2:{s:11:"session_key";s:24:"yrsUI7duBqMFj6Qk7vYFjg==";s:6:"openid";s:28:"oJ2Li5FqGVwfb9idWmfCD-C-VOG4";}
[2018-12-12 10:19:41]用户信息合法,暂时记录用以调试。接收到的参数:a:9:{s:4:"sign";s:0:"";s:1:"t";s:10:"1544581181";s:1:"v";s:2:"10";s:4:"code";s:32:"033wCPXX1D9CZ01ZrCYX14aVXX1wCPXt";s:4:"type";s:1:"1";s:13:"encryptedData";s:536:"";s:9:"signature";s:40:"f0a032dadfcea3108bfb000f8e2d4b39a31458a1";s:2:"iv";s:24:"2LDZs+Zz5UMchNnajuLdRQ==";s:7:"rawData";s:247:"{"nickName":"KAZUKI","gender":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/KUwFGLsK1MHqg2kDJkJCWY5rMbPP0hZZqzXZcBa0WLYoc9szTmPSuYrKv5FbHOOg1xv40sqYFaibiaFzT6ibte1Ag/132"}";}微信获取openid结果:a:2:{s:11:"session_key";s:24:"yrsUI7duBqMFj6Qk7vYFjg==";s:6:"openid";s:28:"";}
[2018-12-12 10:53:33]用户信息不合法,请重新登录。errcode:-41003,接收到的参数:a:9:{s:4:"sign";s:0:"";s:1:"t";s:10:"1544583212";s:1:"v";s:2:"10";s:4:"code";s:32:"033Tpt4C0VUlBi2Xbj3C0PDI4C0Tpt4Z";s:4:"type";s:1:"1";s:13:"encryptedData";s:536:"OAYRzLvjj0sKrFUmfzShZEbN22/B1kV3pScdkVRi7/rPKue7WZAuWrB251+I376/jq1WqJXBpPOTocTn6RAfAxWavtM5DEtbm4Ba5IFvxf2F2LTFZ+v1ijoeEZHlYNSmEuz7eyNceYDjdqdMBh6gD/wGFvBxnMnVIvMj/jvzR7iRO7inU8t245nw5AcObaHavQLj1xD/zd8KRzyOqDC1LqP8FSvwlg/pB180vZZzGeZ5E+ppW/fjudqdc9DWyI/bcAlbfvUpTsqB4NkRQR8MpzmKC+qYWXc0V7dM8QZSVgWHYfol2+YIzg5kPoyGvXoHx/+dnNAE3ezAJTw5DEKJZlDcTvExkBrwHL4MVsImUkBqLJnyF8GiY2oouwhfiV/YwaVKaiY3dE0+4wUphEE/Wa2a7HFtAb7Mn1iRQ6AlD6rJzubnXhHqGYQ+BdtLG0Ba1ajJniAWqqjVDhExpMZ78KXVCmQV7yMueBDn6CBp754q4caWVuTlmMvMFQhSnA8HHjqL5ZbHgCddl9koPP+NEg==";s:9:"signature";s:40:"f0a032dadfcea3108bfb000f8e2d4b39a31458a1";s:2:"iv";s:24:"bHq9jOZsvlXL0awzxvtRww==";s:7:"rawData";s:247:"{"nickName":"KAZUKI","gender":1,"language":"zh_CN","city":"广州","province":"广东","country":"中国","avatarUrl":"https://wx.qlogo.cn/mmopen/vi_32/KUwFGLsK1MHqg2kDJkJCWY5rMbPP0hZZqzXZcBa0WLYoc9szTmPSuYrKv5FbHOOg1xv40sqYFaibiaFzT6ibte1Ag/132"}";},微信获取openid结果:a:2:{s:11:"session_key";s:24:"SKAfN8Ndwr3S43m5MsWhRg==";s:6:"openid";s:28:"";}
请问这个问题解决了么
2023年3月22日,问题仍然存在
2020年7月1日 问题依旧
我最近也遇到这个问题, 大概隔10分钟, 走两遍wx登录就会出错, 其实也不是登录报错, 是getuserInfo报错, 所以登录和getuserInfo同时进行会导致这个问题。 我猜想客户端调用getuserInfo时用旧的sessionKey加密的, 传给后台自然也是旧的sessionKey加密后的数据, 然后后台调用codeToSeesion接口刷新了sessionKey, 这样微信端校验时就不能通过。 我想到的办法是登录和解析用户信息getuserInfo分开, 先登录后, 不管sessionKey刷不刷新, 都能保证微信那边跟你这边是一致的, 然后客户端getuserInfo拿到的数据肯定是这个一致的sessionKey加密的, 去微信解析时肯定不会报错了
请问解决了么?刚好也遇到了这个问题
出现同样的问题 后台都整崩溃了 目前解决方案获取sessionkey后延迟1s处理之后的请求 就能成功
嗯就是+1s
我试了也不行,你是吧请求分开还是让线程睡一秒?
看了登录流程 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html之前我们后台顺序是code给后台,(对接微信)后台返回sessionkey并给小程序,小程序再传用户信息和sessionkey给后台(对接微信)之后。这个步骤其实有问题,发生了两次连续请求微信服务器(可能导致发生微信返回错误),微信官方的登录流程只用请求一次微信服务器,并且不会返回session可以给前端,官方文档也建议的是不要把session下发到小程序,这时候只需要给小程序一个登陆状态就可以了。
我现在的登录流程就是code给后台,后台处理好吧状态给小程序,可是就是会有那个问题(每次登录都要登录2次,2次后重新登录都是直接登录成功)
看你上面描述 每次都获取到了sessionkey和openid了 为什么会连续去请求微信服务器呢?你的意思是第一次用code给后台取微信请求就出错了?
是的。第一次code给后台后台取到sessionKey去解密的时候会报错,第二次再点击登录解密就不会出错,我看了日志,2次的sessionKey是一样的