关键词
小程序 、wafer2-client-sdk、vendor、小程序登录会话、Session、带登录态的请求
摘要
由于项目开发需要,涉及到 小程序,本文以学习过程为线索,进行记录。
目录
一、Session(会话控制)概述
二、小程序登录
—— 1、微信临时登录接口 wx.login(OBJECT)
—— 2、会话校验 wx.checkSession(OBJECT)
三、wafer2-client-sdk(vendor)
—— 1、整体分析
—— 2、login
—— 3、request
正文
一、Session(会话控制)概述
Session 直接翻译成中文的意思为会话,但一般都译成时域。在计算机专业术语中,Session 是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。
作用:HTTP 协议本身是无状态的,这与 HTTP 协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。 Session 一般用于保持会话状态的基于 Web [服务器]的方法。Session 允许通过将对象存储在 Web 服务器的内存中在整个用户会话过程中保持任何对象。
关键点:保持会话状态,时效性
二、小程序登录
1、微信临时登录接口 wx.login(OBJECT)
a. 接口定义
OBJECT 参数说明
参数名
类型
必填
说明
最低版本
timeout
Number
否
超时时间,单位 ms
success
Function
否
接口调用成功的回调函数
fail
Function
否
接口调用失败的回调函数
complete
Function
否
接口调用结束的回调函数(调用成功、失败都会执行)
success 返回参数说明
参数名
类型
说明
errMsg
String
调用结果
code
String
用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 api,使用 code换取 openid 和 session_key 等信息
b. 登录过程
通过调用该接口 wx.login(OBJECT),获取用户登录凭证 code(有效期五分钟);
使用 code, 请求项目的小程序服务器;
项目的小程序服务器会使用 code,appid, appsecret 访问微信小程序接口,获取以下信息:
微信用户唯一标识 openid,
会话密钥 session_key
返回 会话密钥 session_key 到小程序客户端,完成登录。
登录完成后,将session_key保存至本地,通过wx.getUserInfo( )获取用户信息(昵称,头像等)
2、会话校验 wx.checkSession(OBJECT)
a. 接口定义:校验用户当前session_key是否有效。
OBJECT参数说明:
参数名
类型
必填
说明
success
Function
否
接口调用成功的回调函数,session_key未过期
fail
Function
否
接口调用失败的回调函数,session_key已过期
complete
Function
否
接口调用结束的回调函数(调用成功、失败都会执行)
b. 会话密钥(session_keyd)的有效性
开发时,如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。
重新登录后session_key 失效
每次调用wx.login()时,用户的session_key会被更新,使旧的session_key失效。所以在每次调用wx.login()前,需通过wx.checkSession(OBJECT)接口校验是否需要重新登录,从而避免小程序反复执行登录流程。
超过有效期session_key 失效
微信后台不会把session_key的有效期告知开发者。微信后台会根据用户使用小程序的行为对session_key进行续期。用户使用小程序越频繁,session_key有效期越长。
当开发者在实现自定义登录态时,可以考虑以session_key有效期作为自身登录态有效期,也可以实现自定义的时效性策略。
三、wafer2-client-sdk(vendor)
1、sdk文件分析
image.png
2、login.js解析
请对照源码阅读
* 进行服务器登录,以获得登录会话
*
* ->Session.get() 获取用户信息 session.userInfo
* ---> 无用户信息 ----------------------------》doLogin()
* ---> 有用户信息 wx.checkSession()
* ------->success 未过期--------------------------------------------------------》options.success(userInfo)(session.userInfo)
* ------->fail 已过期 doLogin()
* ---------->getWxLoginResult()
* --------------->wx.login() 登录
* --------------------> fail --------------------------------------------------》options.fail(LoginError)
* --------------------> success
* ------------------------> 得到用户登录凭证 code
* ------------------------> wx.getUserInfo() 获取用户信息
* ----------------------------> fail-------------------------------------------》options.fail(LoginError)
* ----------------------------> success wx.getUserInfo()
* -------------------------------->fail----------------------------------------》options.fail(LoginError)
* -------------------------------->success userResult{头像iv,用户信息userInfo,加密数据encryptedData}
* ----------------------------------->wx.request() //请求服务器登录地址,获得会话信息session
* -------------------------------------->url: options.loginUrl
* -------------------------------------->method: options.method
* -------------------------------------->data: options.data
* -------------------------------------->header: {code, encryptedData, data}
* -------------------------------------->fail-----------------------------------》options.fail(LoginError)
* -------------------------------------->success res
* ------------------------------------------>Session.set(res.skey) 保存session
* ------------------------------------------->options.success(userInfo)
3、request.js
待续
注:本文是通过搜集网络资源,项目实践后,整合撰写,转载请备注出处。