小程序登录授权获取逻辑
原生的小程序提供许多开放接口供使用者开发,快速建立小程序内的用户体系。
下面将小程序校验、登录、授权、获取用户信息诸多接口串联起来,以便更直观的认识到这些接口是如何在实际应用中使用的。
一、 检验、登录
wx.checkSession({ success: function() { //session_key 未过期,并且在本生命周期一直有效 }, fail: function() { //session_key 已经失效,需要重新执行登录流程 wx.login({ success: (res) => { if (res.code) { //发起网络请求 wx.request({ //开发者服务器通过code换取用户唯一标识openid 和 会话密钥session_key。 url: 'https://test.com/onLogin', data: { // 临时登录凭证code,并回传到开发者服务器 code: res.code }, success: function(result) { //返回业务数据,前后端交互身份识别 } }) } else { console.log('登录失败!' + res.errMsg) } } }); } })
login说明:
-
小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
-
开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
会话密钥session_key有效性:
开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。
-
wx.login()调用时,用户的session_key会被更新而致使旧session_key失效。开发者应该在明确需要重新登录时才调用wx.login(),及时通过登录凭证校验接口更新服务器存储的session_key。
-
微信不会把session_key的有效期告知开发者。我们会根据用户使用小程序的行为对session_key进行续期。用户越频繁使用小程序,session_key有效期越长。
-
开发者在session_key失效时,可以通过重新执行登录流程获取有效的session_key。使用接口wx.checkSession()可以校验session_key是否有效,从而避免小程序反复执行登录流程。
-
当开发者在实现自定义登录态时,可以考虑以session_key有效期作为自身登录态有效期,也可以实现自定义的时效性策略。
二、 授权获取用户信息
// 可以通过 wx.getSetting 先查询一下用户是否授权了 "scope.record" 这个 scopewx.getSetting({ success(res) { if (!res.authSetting['scope.record']) { wx.authorize({ scope: 'scope.record', success() { // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问 wx.startRecord() } }) } }})
注意:wx.authorize({scope: "scope.userInfo"}),无法弹出授权窗口,请使用 <button open-type="getUserInfo"></button>
如果用户已经授权,要获取用户信息,调下面接口:
wx.getSetting({ success: (res)=>{ if (res.authSetting['scope.userInfo']) { // 已经授权,可以直接调用 getUserInfo 获取头像昵称 wx.getUserInfo({ withCredentials: true, success: (res) => { console.log(res); } }) } } });
注意:
- 当用户未授权过,调用该接口将直接报错
- 当用户授权过,可以使用该接口获取用户信息