还不会微信小程序登录鉴权的,教程看这里!

做开发的都知道,我们在做微信小程序开发过程中会遇到各种各样的问题,为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态。下面小编就来手把手的教会大家在业务里如何接入和维护微信登录态,不会的抓紧看这里。

接入流程

这里官方文档上的流程图已经足够清晰,我们直接就该图展开详述和补充。

首先大家看到这张图,肯定会注意到小程序进行通信交互的不止是小程序前端和我们自己的服务端,微信第三方服务端也参与其中,那么微信服务端在其中扮演着怎样的角色呢?我们一起来串一遍登录鉴权的流程就明白了。

1.调用wx.login生成code

wx.login()这个API的作用就是为当前用户生成一个临时的登录凭证,这个临时登录凭证的有效期只有五分钟。我们拿到这个登录凭证后就可以进行下一步操作:获取 和

2.获取openid和session_key

那么sessionkey是用来干嘛的呢?有了用户标识,我们就需要让该用户进行登录,那么 就保证了当前用户进行会话操作的有效性,这个sessionkey是微信服务端给我们派发的。

从这几个参数,我们可以看出,要请求这个接口必须先调用wx.login()来获取到用户当前会话的code。那么为什么我们要在服务端来请求这个接口呢?其实是出于安全性的考量,如果我们在前端通过request调用此接口,就不可避免的需要将我们小程序的appid和小程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有心之人”,这就给我们的业务安全带来极大的风险。

除了需要在服务端进行session_key的获取,我们还需要注意两点:

代码:

3.生成3rd_session

那么我们如果生成自己的登录态标识呢,这里可以使用几种常见的不可逆的哈希算法,比如md5、sha1等,将生成后的登录态标识(这里我们统称为'skey')返回给前端,并在前端维护这份登录态标识(一般是存入storage)。而在服务端呢,我们会把生成的skey存在用户对应的数据表中,前端通过传递skey来存取用户的信息。

可以看到这里我们使用了sha1算法来生成了一个skey:

4.checkSession

前面我们将skey存入前端的storage里,每次进行用户数据请求时会带上skey,那么如果此时sessionkey过期呢?所以我们需要调用到wx.checkSession()这个API来校验当前sessionkey是否已经过期,这个API并不需要传入任何有关sessionkey的信息参数,而是微信小程序自己去调自己的服务来查询用户最近一次生成的sessionkey是否过期。如果当前sessionkey过期,就让用户来重新登录,更新sessionkey,并将最新的skey存入用户数据表中。

checkSession这个步骤呢,我们一般是放在小程序启动时就校验登录态的逻辑处,这里贴个校验登录态的流程图:

下面代码即校验登录态的简单流程:

5.支持emoji表情存储

如果需要将用户微信名存入数据表中,那么就确认数据表及数据列的编码格式。因为用户微信名可能会包含emoji图标,而常用的UTF8编码只支持1-3个字节,emoji图标刚好是4个字节的编码进行存储。

这里有两种方式(以mysql为例):

1.设置存储字符集

在mysql5.5.3版本后,支持将数据库及数据表和数据列的字符集设置为 ,因此可在 设置默认字符集编码及服务端编码格式。

设置完默认字符集编码及服务端字符集编码,如果是对已经存在的表和字段进行编码转换,需要执行下面几个步骤:

1、设置数据库字符集为

2、设置数据表字符集为

3、设置数据列字段字符集为

这里的 指的是排序字符集,也就是用来对存储的字符进行排序和比较的, 常用的collation有两种: 和 ,一般建议使用 ,因为它是基于标准的 来排序的,可以在各种语言进行精确排序。

这两种排序方式的具体区别可以参考:What's the difference between utf8generalci and utf8unicodeci

2.通过使用sequelize对emoji字符进行编码入库,使用时再进行解码

这里是sequelize的配置,可参考Sequelize文档

最后,讲了微信小程序如何接入微信登录态标识的详细流程,希望可以帮到大家。

 

来源:春哥技术博客,欢迎分享,(春哥微信号:cgnanyin)
上一篇:微信小程序常用样式大全,你要找的都在      下一篇:微信小程序的底层架构原理—技术干货!