官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html

一、登录

1. 登录流程

登录之后可以获得微信官方给我们提供的“用户身份标识”,与我们的小程序建立联系
步骤如下:

  1. 前端调用 wx.login() 获得「临时登录凭证」,向后端发请求
  2. 后端调用 auth.code2Session 接口,换取「用户唯一标识 OpenID」和「会话密钥 session_key」
  3. 前端拿到后端回传给的数据,确定登录状态,做相应业务逻辑

2. UnionID 机制

UnionID 可以用来区分用户的唯一性,那么怎么能获取用户 UnionID 呢?
(从2021年2月23日起,微信调整了接口,可以直接使用 wx.login 获得临时登录凭证)

  • wx.login 获取临时登录凭证 code 发送给后端,后端用这个 code 与微信接口服务打交道获取 UnionID

老版本是下面两种方式(已废弃)

  • wx.getUserInfo(需要用户授权)
  • wx.login + code2Session(用户关注/授权登录过同主体的公众或移动应用,无需用户再次授权)

3. 授权

部分接口需要用户授权,调用时小程序会做以下不同的判断,判断逻辑如下:

  • 用户已授权 → 直接进入接口的 success,不会有弹窗
  • 用户已拒绝 → 直接进入接口的 fail,不会有弹窗
  • 用户未授权 → 会弹窗询问用户,根据用户反馈进入 success 或 fail

前端和用户可以查看授权状态

  • 前端可以通过 wx.getSetting 可以获取用户当前的授权状态
  • 用户可以通过小程序(「右上角」 - 「关于」 - 「右上角」 - 「设置」)中控制对该小程序的授权状态

前端可以使用 wx.authorize 在调用授权 API 之前提前做发起授权请求的处理
按照 scope 分类,有如下需要授权才能用的接口

scope.userInfo wx.getUserInfo 用户信息
scope.userLocation wx.getLocation, wx.chooseLocation 地理位置
scope.userLocationBackground wx.startLocationUpdateBackground 后台定位
scope.werun wx.getWeRunData 微信运动步数
scope.record wx.startRecord 录音功能
scope.writePhotosAlbum wx.saveImageToPhotosAlbum, wx.saveVideoToPhotosAlbum 保存到相册
scope.camera camera 组件 摄像头
scope.address wx.chooseAddress 通讯地址(可以直接调用)
scope.invoiceTitle wx.chooseInvoiceTitle 发票抬头(可以直接调用)
scope.invoice wx.chooseInvoice 获取发票(可以直接调用)

授权有效期

  • 一旦用户明确同意或拒绝授权,其授权关系会记录在后台,直到用户主动删除小程序

最佳实践

  • 在真正需要使用授权接口时,在想用户发起授权,并附带使用该功能的理由

注意事项

  • wx.authorize({scope: “scope.userInfo”}),不会弹出授权窗口,请使用
  • 需要授权 scope.userLocation、scope.userLocationBackground 时必须配置地理位置用途说明
  • 后台定位 scope.userLocationBackground 不会弹窗提醒用户,需要用户在设置页中,主动将“位置信息”选项设置为“使用小程序期间和离开小程序后”。开发者可以通过调用wx.openSetting,打开设置页

「@浪里淘沙的小法师」