小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识,快速建立小程序内的用户体系。

登录流程

实现小程序用户登录流程,大致分为以下几个步骤

  1. 调用 wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
  2. 调用 auth.code2Session 接口,换取用户唯一标识 OpenID 和会话密钥 session_key。自定义登录状态关联openid和session_key,返回自定义登录状态
  3. 前端缓存自定义状态到storage,wx.request()携带自定义登录状态请求数据
  4. 开发者服务器通过自定义登录状态查询openid和session_key,验证通过返回业务数据

微信小程序实现用户登录流程_数据库

接下来仔细讲讲实现过程

1 获取临时code

通过调用wx.login(),获取登录凭证,有效期为5分钟

wx.login({
success (res) {
console.log(res.code)
}
})

2 调用 auth.code2Session 接口,换取用户唯一标识

此步骤需要在服务端完成,get方式请求

https://api.weixin.qq.com/sns/jscode2session?
appid=APPID& // 小程序 appId
secret=SECRET& // 小程序 appSecret
js_code=JSCODE& // 登录时获取的 code
grant_type=authorization_code // 授权类型,此处只需填写 authorization_code
返回值

返回JSON数据包,包含openid、session_key等。创建自定义登录状态,与openid、session_key关联,存到数据库。并把自定义登录状态返回前端。

注意:这里强调下,session_key是有时效的,但是后台无法验证,需要前端验证。且微信官方不建议直接返回openid给前端。

3 缓存自定义登录状态,请求业务数据带上自定义登录状态

上面说到session_key是有时效的,如果我们调用微信接口(如服务端获取用户开放数据),一定要保证session_key在有效期内。所以在请求前要验证登录状态是否过期

wx.checkSession({
success () {
//session_key 未过期,并且在本生命周期一直有效
},
fail () {
// session_key 已经失效,需要重新执行登录流程
wx.login() //重新登录
}
})

4 验证并返回业务数据

这里的验证不是说验证session_key是否在有效期内,而是验证是否存在session_key和openid,微信官方未提供服务端验证方法,也不会把 session_key 的有效期告知开发者,下面就是官方对会话密钥 session_key 有效性的解释

微信小程序实现用户登录流程_session_02

这里我个人觉得,如果是自有业务的接口,session_key不是很重要,也可以说不需要,session_key是否有效,对自有业务影响不大,就比如拿我们现在项目来说,查询用户数据列表,直接在开发者服务器数据库获取,我只要验证这个用户是否存在即可。而什么时候需要验证session_key是否有效呢,比如我需要根据session_key来解析用户敏感数据,这个时候session_key必须有效,否则拿不到数据。