官方文档如是说:
> 在回调中调用 wx.login 登录,可能会刷新登录态。此时服务器使用 code 换取的 sessionKey 不是加密时使用的 sessionKey,导致解密失败。建议开发者提前进行 login
;或者在回调中先使用 checkSession
进行登录态检查,避免 login
刷新登录态。
其中给出2个方案:
1、提前调用wx.login,获取code。
2、在回调中调用 checkSession
检查登录状态
但这2个方案都有缺陷:
1、code码时效只有5分钟,如果提前获取到code后,用户5分钟之后才授权,那么这个code码也已经失效。
2、checkSession检查登录失效后,还是需要再调用wx.login获得code,但此次用户授权手机号也无效了,需要用再次授权,影响用户体验。
总之,目前官方文档给出的方案都不完美。
希望有大佬能给出完美方案,小弟感激不尽
实在没看懂你想表达什么,点击授权时,如果五分钟没到,就用老的code,过期了就会获取新code,点击授权这个时候只是获取encryptedDataStr,iv,这个时候还没有手机号,第一步是通过code获取 session_key之类的,然后再配合授权获取的两个参数解密手机号,这个时候已经有登陆状态了,存下来,只要网络正常,你们服务器正常,不存在你所描述的,点击授权,code失效问题,接口请求都是毫秒计算