小程序官网里面会提到一个小程序的登录逻辑,下面是微信登录的整个过程,官方提供的图片。
官方流程的个人理解:
1.小程序启动。
2.小程序通过wx.login
获取微信的 code,然后将这个 code 发送给开发者服务器(我们自己的开发服务器)
3.开发者服务器接收到code 之后,小程序服务端拿到code去微信服务器换取获取真正需要的微信用户的登录态session_key
和 openid
和 unionid
。
a.准确来说session_key
才是真正的微信登录态信息,但是把 openid
和 unionid
加起来一起理解,也可以笼统地理解为这些都是微信的登录态信息。
4.然后需要开发者服务器自己生成一个自定义的登录态(例如业务 token或者 session)来保存这些微信服务器返回来的微信登录态相关信息(session_key
和 openid
和 unionid
),并且做关联处理,然后返回给小程序客户端。
- 关联处理就是你的自定义登录态和微信的登录态相关联,这样的话就不需要维护多个登录态,只需要维护一个就可以了。
- 关联处理之后需要将这个自定义登录态信息保存起来,可以放到数据库或者本地文件或者 例如 redis 之类的缓存服务里面,以便方便后续使用,而不需要每次都请求微信服务器(微信服务器对这个请求的频率是有限制的)。
- 注意这里不返回微信登录态相关信息,只返回自定义的登录态信息。
- 自定义登录态的信息不仅可以包含 token,也可以包含一些用户权限信息,或者其他信息,因为是自定义的登录态,维护也是很自定义的。
- 一般自定义的登录态的超时时长需要比微信的登录态要长。
5.小程序客户端接收到返回的自定义登录态信息,从而判断用户是否登录成功,登录成功的话,就将自定义登录态信息保存到本地的存储。
- 本地的存储可以是微信小程序提供的
app.globaldata
,也可以是localstoage
,注意,小程序不支持cookie
。 - 保存到本地存储的好处就是,后续使用的这个自定义登录态就不需要再次跟服务器进行交互来获取了,只需要调用本地存储就行了,这里是为了优化性能和避免浪费资源
6.小程序客户端访问业务接口的时候,携带之前保存到本地存储的自定义登录态信息进行对开发者服务器(业务接口服务器)访问
7.开发者服务器的业务接口接收到请求,并且请求里面携带了自定义的登录态,通过校验之后,会返回相关信息
- 校验是将小程序客户端携带过来的自定义登录态和开发者服务器缓存起来的自定义登录态进行对比,会去确认是否和用户的
openid
或者unionid
和session_key
相匹配。 - 如果匹配,就可以马上返回相关信息。
- 如果不匹配,就可以马上返回相关信息,告知小程序客户端无法访问业务接口。
- 如果匹配结果是自定义登录态超时了,就可以马上返回相关信息,告知小程序客户端需要重新运行登录逻辑
- 如果是匹配结果是自定义登录态没有超时,但是微信登录态超时了,那么就会开发者服务器就会再次发起
code2Session
进行微信登录态更新。
上面的图里面的一些术语解释:
code
是微信用户的临时的登录凭证,有效时间五分钟,为了后续生成一个微信登录态 session_key
而使用的;
session_key
是微信用户在小程序里面的登录态信息,这是微信给这个用户颁发的一个登录 session
。
openId
,用户在微信里面的唯一标识,但是需要跟 unionid
进行一起理解;
unioinId
,如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过unionid
来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的unionid
是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid
是相同的。
- 一般来说,
openId
就是微信用户的唯一标识,但是因为微信产品很多,所以会出现多个微信产品使用不同的openId
来标识用户,但是对于我们做业务接入的话,就买办法使用了,所以建议是统一使用unioinid
,因为一般来说,一般的业务都会有公众号,小程序联合使用的,所以unionid
使用频率较高。
3rd_session
是一般是指开发者服务器的登录态,也就是自定义登录态,也就是我们自己公司的业务服务器的登录态(微信官方推荐使用自定义登录态来管理整个微信小程序登录)。
示例代码如下:
wxlogin(){
wx.login({
success:(data) => {
if(data.code){
wx.request({
url: 'https://test.com/login', //请求接口
method: 'POST',
data: {//需要传递的参数
'captcha': 1234,
'mobile': 13148435812,
'code': data.code //用户的code
},
success(res) {//服务器返回来的数据
if (res.statusCode != 200) {
return wx.showToast({
title: '请求失败',
})
}
wx.setStorageSync('key', res.data.data.access_token); //本地存储token
wx.switchTab({
url:'/pages/home/home'
})
console.log( wx.getStorageSync('key'));
return wx.showToast({
title: '登录成功',
})
}
})
}
}
})
参考文档:
小程序开发-梳理登录流程-v1.0 - SegmentFault 思否文章来源:https://www.toymoban.com/news/detail-487409.html
教程 | 《小程序开发指南》文章来源地址https://www.toymoban.com/news/detail-487409.html
到了这里,关于微信小程序登录流程理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!