在开发微信小程序的时候,如果要用到微信登录功能,一般都会用到两个方法:
wx.checkSession和wx.login方法。开发的代码如下:
前端代码中,首先调用checkSession,判断session是否失效,如果没有,则不处理,如果失效了,则调用wx.login方法进行登录。
服务端代码中,通过code,调用https://api.weixin.qq.com/sns/jscode2sessionappid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
获取openId和session_key。然后保存在session中。我设置了后端的session的超时时间是60分钟
遇到的问题:
1. 微信小程序有个问题,就是每次请求对应的sessionid都是不一样的,导致登录时保存在session中的session_key在别的请求中是取不到的。如下:
我在登陆成功后已经将openId保存到了session中,但是getOpenId方法中却取不到对应的openId。为了解决这个问题,我在登陆的wx.login的success中将cookie中的sessionid保存到了storage中
在访问别的请求的时候将该cookie带上,就可以保证每次都访问同一个session,这样就能取到session中的数据了。
2. 后端session过期或者已经失效了,但是checkSession还是success。
我在过了60m后,或者重启后端服务器,让后端的session过期了,但是checkSession还是会返回success。
得到的结论是后端的session过期与否与checkSession返回success没有关系。checkSession用来判断登录信息既session_key是否已经在微信端失效,即服务端的session失效了但是session_key在微信端没有失效,checkSession也是会返回seccess的。
checkSession不用传参,就是用来检查最近一次获取到的session_key在微信端是否失效。
综上,用来判断我们服务端的session是否失效,不能通过checkSession来判断,应该通过服务端的session是否失效来判断。
就像微信小程序中给的登录流程一样。我们判断自定义的登录状态即服务端的session是否失效,如果没有失效,就当登录没有失效。如果失效了,就重新调用wx.login的方法进行登录
在用到session_key进行解密时,如果解密失败的话,说明服务端的session_key已经失效了,但是服务端的session没有失效。这个时候也可以调用wx.login重新获取session_key,保存在session中
总结起来就是:
1.在服务端的session中没有openId和session_key了,我们就去调用wx.login去登录,然后将openId和session_key保存服务端的session中
2.在用服务端的session进行解密数据失败时,说明session_key在微信端已经失效了,我们也调用wx.login去登录,将获取的session_key保存在服务端session,重新去获取要解密的数据,在用新的session_key去解密就好了