那个3rd_session 这个是自己生成的, 回传给客户端,但是客户端请求的时候都是怎么带上这个参数的呢?包装一个函数,每次都带上这个值吗?
php的话, 自己做会话管理,用什么方法合适,数据库吗?还是文件形式,哪种效率高,我是个人开发者,没有团队经验
小程序登录流程:
第一步:
前端:
1、调用wx.login获取code,将 code 作为参数并发送网络请求到后台换取 openId, sessionKey, unionId;
后端:
1、接收前端传来的code并调用微信api获取 openId, sessionKey, unionId;
2、生成sessionid作为用户会话标识,也就是3rd_session,将sessionid作为key,openId和sessionKey作为value,并为其设置有效期,存储到redis或其他内存数据库中,持久化;
3、仅返回sessionid到前端(openId, sessionKey, unionId不应返回);
第二步:
前端:
1、接收后台返回的sessionid,并存入本地缓存(手机内存);
当需要请求用户相关数据时,在请求头带上sessionid发送网络请求到后端;
后端:
1、接收前端传来的sessionid,验证其合法性及有效期,根据验证结果进行逻辑处理;
验证成功:继续执行业务逻辑;
验证失败:返回失败状态码到前端;
前端:
1、接收后台返回数据;
成功:执行前端业务逻辑(数据展示等);
失败:根据返回状态码判断是否重新登录;
重新登录:调用wx.login获取code…(重新执行一遍登录流程)
以上就是根据官方文档的要求和处理流程归结的小程序登录流程。
客户端请求的时候都是怎么带上这个参数的呢?
答:
可以将 封装在http请求头中,如:
header: {
“Content-Type”: “application/json”,//post时应使用:“Content-Type”: “application/x-www-form-urlencoded”
‘Authorization’: 'Bearer ’ + authorization,//后端授权凭证(后端接口的token验证,与小程序登录流程无直接关系)
‘Cookie’: “sessionid=” + sessionid //后端返回的sessionid,在发送网络请求前,从本地缓存中取出,在这里带上
}
后端获取sessionid:以.net为例
//从Cookie中获取sessionid
string sessionId = “”;
CookieHeaderValue cookie = Request.Headers.GetCookies(“sessionid”).FirstOrDefault();
sessionId = cookie[“sessionid”].Value;
取得sessionid之后,以sessionid为key,到redis中取值,根据取值结果(取到或没取到)进行逻辑处理;
成功取值:说明sessionid有效且未过期,也就说明当前登录有效,即可进行与用户相关的数据操作;
未取到值:说明sessionid不存在或已过期,也就说明当前登录无效,返回状态码到前端,前端根据状态码处理,根据实际需求判断是否需要重新登录。
以上是微信小程序登录的全部流程。
很详细了,谢谢。但是我也在github上面看了一些源码,有部分代码不按微信的方法走,直接调用自己的服务器接口,传用户名、密码。服务器判断成功返回token和用户信息给前端,前端把信息保存在手机缓存。请问这样这样的方式也可以吗??
可以把wx.request封装成公共函数,比如放在app.js中或者在utils下单独一个js,用module.exports暴露出接口函数,用时导入。
如:
在/utils/request.js中封装网络请求处理函数
/**
* 模块化导出暴露接口
*/
module.exports = {
//http请求
httpRequest: httpRequest
}
//http请求封装
function httpRequest() {
//http请求处理,略…
}
在某页面使用网络请求函数
//引入http请求模块
var request = require(’…/…/utils/request’)
//加载列表
function doLoadList() {
var that = this
//发送http请求
request.httpRequest({
//获取列表
url: “api/xxx/getList”,
method: “GET”
}).then(res => {
if (res.statusCode == 200) {
if (result.Code == 0 && result.Data != null) {
//设置data数据
that.setData({
list: result.Data
})
}
}
})
}