我感觉目前getuserinfo的button存在bug,并不是session的问题 说下我的流程: 1、页面onload,里wx.checksession,fail了就wx.login,第一次打印log输出未过期 2、页面加载后立刻点击getUserInfo的button 3、getUserInfo的回调中,首先wx.login(这个实际上不需要,这里只是为了复现bug),获取code 4、发送code和button回调中的rawData和签名A到服务端 5、服务端验签失败,输入log中,sessionkey为A 6、立刻第二次点击(第二步),此时checksession依然输出未过期 7、发送新code和统一的rawData还有签名B到服务端,注意这里的签名B肯定跟刚才的签名A不一样 8、服务端验签成功,log中显示,sessionkey依然为A 第二次尝试,中间增加wx.getUserInfo: 1、页面onload,里wx.checksession,fail了就wx.login,第一次打印log输出未过期 2、页面加载后立刻点击getUserInfo的button 3、getUserInfo的回调中,首先wx.login(这个实际上不需要,这里只是为了复现bug),获取code 4、调用wx.getUserInfo,打印log,输出签名 W1 5、发送code和button回调中的rawData和签名A到服务端 6、服务端验签失败,输入log中,sessionkey为A 6、立刻第二次点击(第二步),此时checksession依然输出未过期 7、发送新code和统一的rawData还有签名B到服务端,注意这里的签名B肯定跟刚才的签名A不一样 8、调用wx.getUserInfo,打印log,注意输出签名仍为 W1 9、服务端验签成功,log中显示,sessionkey依然为A 结论是: 1、在一个生命周期内,多次调用wx.login并不会改变code换回来的sessionkey 2、在wx.login中,button和wx.getUserInfo返回的签名不同,但多次点击,每一次的button和button是一样的,wx.getUserInfo和wx.getUserInfo也是一样的,但是一小段时间后,就都会换新的签名了 3、但是2中有个问题,如果页面刷新,过一会点击,这时候button返回的签名是无效的,wx.getUserInfo是有效的!再次点击,button的签名换了(这时候是有效的),wx.getUserInfo的签名没变,这时候也是有效的 4、最简单的处理办法是button回调里面再调wx.getUserInfo一次,用wx.getUserInfo的信息去请求服务端,此方式比较繁琐但没有任何问题 具体还要看官方人员排查,开发者也要维护要checksession和wx.login,不要频繁login
小程序验证签名(登录)的流程(含官方解答的最佳实践)小程序审核突然没通过,理由如下: [图片] 这个问题开发过程中自己确实遇到过,几率性的,一般第一次不行,第二次肯定可以了,但是不是一开始写小程序就有的,不知道什么时候开始就这样了,验证的逻辑都是按照官方的,从来没有改变过。然后上社区一搜,很多类似的问题,如下图所示。 [图片] 看了下这个问题,第一次验证签名如下: [图片] 小程序端通过wx.login成功后获取的code rawdata,这个我都是同一用户登录,前后信息没啥变化 通过1中的code,后端调用api获得的session data,其中openid肯定同一用户每次也都一样的,session_key如果过期,那么第一次和第二次理论应该是不一样的。(但实际情况前后两次是一致的,具体可参见下图) 小程序端获取到的用户的签名 后端通过session key校验出来的签名。 很明显,4和5不一致,校验失败。接下来是第二次交验: [图片] 还是同样的逻辑顺序。 小程序端通过wx.login成功后获取的code。很明显,code跟第一次是不一样的,另外根据官方文档描述,因为又重新调用了wx.login,会导致session_key过期。(这似乎说明code发生变化也是对的,因为按推测,seesionkey应该也发生了变化,否则怎么叫“被更新”)请看下图官方文档说明:[图片] rawdata,这个我都是同一用户登录,前后信息没啥变化 根据1中的官方描述,奇怪的现象就发生了,在后端根据新的code,获取的session data,很明显session key还是第一次是一样的,也就是说,我重新调用了wx.login, code是变了,但是session key却和第一次保持一致的。 小程序端获取到的用户的签名 后端通过session key校验出来的签名。因为用的是同样的rawdata,同样的session key,所以两次校验的结果是一样的,但是第二次4中,小程序端获取的签名是跟此次校验结果是一致的。 所以问题就来了,这问题到底出在什么地方?似乎官方文档描述的就有问题,还是我本身的逻辑顺序有问题?请官方指教,谢谢。
2019-01-14