小程序登录状态维护---SessionKey的正确使用姿势

小程序用户身份的标识可以使用openid,如果是多平台的可以使用unionid,这两个字段对于一个小程序和用户而言是固定不变的,基本上是获取一次与业务系统的用户ID建立对应关系,然后就万事大吉了。

在实际使用中用到SessionKey的场景不多。比如用户信息openid和unionid获取、用户手机号的获取。前者是wx.login()中通过code就能获取到,用SessionKey来解密的场景基本上就很少了。但是要是获取用户手机号的时候就要使用有效的SessionKey。要注意了是“有效”,虽然在获取SessionKey的时候有个过期时间,但是在很多场景下经常会出现超时或已经过期的情况。比如常见的一种情况是用户信息解密、手机号解密有时可以正常解密,有时候就不行。这时候基本上的问题就是解密用的SessionKey和与加密用的SessionKey不是同一个了。

那怎么知道当前的SessionKey有没有过期,按时间来算是不行的。小程序提供wx.checkSesstion()这个函数,在需要解密之前先判定一下有没有过期,如果已经过期那么就先wx.login(),这时再请求加密数据(用户信息或手机号信息),然后做解密操作的时候就可以正常的使用了。

如何管理SessionKey有效期

调用wx.login()获取code,服务端根据这个code和appid和appsecret获取SessionKey。把SessionKey保存到服务器上,一般是不在网络传输,建立自己的SesstionID和生成的SessionKey的对应关系。然后把生成的SessionID传输到小程序客户端,在小程序本地缓存。在需要使用SessionKey的场景时先使用wx.checkSession()判定一下有没有过期,如果没有过期就把本地的SessionID传输到服务端,服务端根据SessionID查询对应的SessionKey,进行后继的业务操作。如果本地判定已经过期,那就先wx.login()重新生一次。