登录常见的场景如下:
用户一进入小程序登录页面,调用wx.login获取微信的code。用户点击“获取手机号”的getphonenumber按钮,得到授权令牌。然后后端调用用jscode2session接口获取sessionKey,再利用sessionKey解密授权令牌得到手机号。
在上述过程中,如果code超过5分钟(官方没确切时间),code可能会失效,怎么解决这个问题呢?
我想到的下面2个方法都不支持:
- 定时调用:wx.login获取微信的code,但是wx.login 有频率限制。
- 在用户点击“获取手机号”按钮后调用wx.login,但是小程序不支持这种方案,原因参考:https://developers.weixin.qq.com/community/develop/doc/0008044f8244a805d3766d1465b800
还有一个方法不友好,但目前看是唯一办法:
- 使用
wx.checkSession
判断 code 是否有效,当提示失效,用弹窗提示用户重新获取code并重新点击“获取手机号”按钮,但是这种方法非常不优雅。
希望官方给个答复,是否上述方法是唯一解?
步骤1:需要将 button 组件
open-type
的值设置为getPhoneNumber
,当用户点击并同意之后,通过bindgetphonenumber
事件获取回调信息;步骤2:将
bindgetphonenumber
事件回调中的动态令牌code
传到开发者后台,并在开发者后台调用微信后台提供的 phonenumber.getPhoneNumber 接口,消费code
来换取用户手机号。每个code
有效期为5分钟,且只能消费一次。注:
getPhoneNumber
返回的code
与wx.login
返回的code
作用是不一样的,不能混用。注意
从基础库2.21.2开始,对步骤2中换取手机号信息的方式进行了安全升级,上述为新方式使用指南。(旧方式目前可以继续使用,但建议开发者使用新方式,以增强小程序安全性)另外,新方式不再需要提前调用
wx.login
进行登录。你好,请问现在session_key有什么场景是需要用到的呢?
我目前只在GetPhoneNumber 的接口处理中看到可以使用session_key, 但是官方文档中说这种为旧方式, 不建议使用
那请问还有什么场景可能会用到呢? 如果没有场景我在考虑要不要后端就不保留这个session_key的值了
wx.login是一开始调用后后端返回 token 写在 cookie 里,进入小程序查看是否有token
wx.getphonenumber是需要用户点击的,
wx.login是静默执行的,用来获得openid,在用户点击之前,你有大把时间执行wx.login。完全不冲突吧。