标签 微信小程序 下的文章

微信小程序登录中另一种思路

背景

最近在做一个小程序,里面当然有登录功能。小程序的账号和后台管理系统中的账号是有关系的,只有在后台管理系统中录入的、状态正常的账号,小程序端对应的账号才有某些数据操作权限,小程序端和后台管理端的账号是通过手机号码进行匹配的。

方案

当用户首次打开小程序时,会有一个获取用户手机号码的button

<button open-type="getPhoneNumber" @getphonenumber='getPhoneNumber' withCredentials="true" lang="zh_CN">微信快捷登录</button>

getPhoneNumber回调中,可以获取到codeencryptedDataiv三个数据。

先使用wx.checkSession方法看下当前微信的登录状态:

  1. 如果没有登录,那么调用wx.login方法进行登录,也会获取到一个code,注意这个code和上面通过getPhoneNumber获取到的code是不一样的。将wx.login获取到的codeencryptedData以及iv这三个参数传递到后台进行处理。
    后台首先通过code调用微信接口获取到session信息,从session信息中可以获取到session_keyopenidunionid三个数据,然后根据session_keyencryptedData以及iv可以解密出手机号码。
    最后,可以保存openid等信息,根据手机号码匹配进行登录操作,下发token等。
  2. 如果微信登录状态是登录中,那么直接将 getPhoneNumber获取到的code传给后台,后台通过phonenumber.getPhoneNumber这个微信提供的接口直接获取到手机号码,从而进行后续操作(重新下发token、续签token等)。

其实,在微信小程序的登录中,最关键的就是小程序的登录态如何同业务本身的登录态进行统一。至少现在小程序的登录态不知道持续多久,并且也无法主动登出。所以只能通过另外的手段来进行登录态的控制。
这里采用的就是手机号码这个数据,这个手机号码可以在不调用wx.login接口的情况下使用,也就是说是独立的,和小程序登录状态无关的,那么我们就可以使用这个手机号进行相关token的处理。
甚至如果你不需要用户openid的话,甚至连wx.login这个接口都可以不理,根本无需关注微信的登录状态,就以我们通过手机号码获得的token为准即可。