1、环境:
A、客户端:微信小程序
B、涉及组件:button(open-type="getPhoneNumber")
C、涉及API:wx.login,通过该API获取code,服务器通过code调用code2session接口获取session_key
2、场景:
A、前提(用户在使用小程序的过程中,客户端从未调用过wx.login)
B、用户点击button(open-type="getPhoneNumber"),点击“允许”
3、问题:如果客户端从未调用过wx.login,服务器也从未调用过code2session接口,那么这个用户是否存在session_key
若session_key不存在或失效,微信服务器是如何对手机号进行加密的?(按照官方文档,加密时使用session_key做对称加密)
个人猜测:若客户端从未调用过wx.login,那么session_key不存在(或者用户长期未操作导致原有session_key失效)。但在获取手机号时,微信服务器依然能够返回加密后的数据。也就是说,微信服务器很可能在发现session_key不存在或失效时,自己会生成一个用于加密的session_key(生成这个session_key并不代表用户已经登陆,亲测此时调用wx.checkSession返回是fail)。用户想要获取session_key,就必须要要调用wx.login和code2session,获取到的就是微信服务器加密手机号时生成的那个session_key(我亲测是这样的,但因样本数据有限,无法肯定,请官方指正)。
若session_key存在,也就说不执行wx.login,session_key也存在。那么这个session_key是何时生成的?
4、最佳实践,请官方指正
A、app.js的onShow方法中调用wx.login,服务端调用code2session接口,并将session_key存到缓存或数据库中(没有失效时间)
B、用户点击button(open-type="getPhoneNumber"),点击允许。回调函数中先调用wx.checkSession。
若为fail,则调用wx.login获取code,将code和密文一起回传服务器。服务器先调用code2session接口,再使用获取到的session_key解密密文。
若为sucess,则只将密文回传服务器。服务器使用缓存或数据库中的session_key进行解密
是的,基本的验证逻辑是这样的,也符合小程序的开发安全指引。
https://developers.weixin.qq.com/miniprogram/dev/framework/security.html