请问大家小程序登录都怎么做的,官方文档看不太懂
发布于 6 年前 作者 weiguo 2141 次浏览 来自 问答

那个3rd_session 这个是自己生成的, 回传给客户端,但是客户端请求的时候都是怎么带上这个参数的呢?包装一个函数,每次都带上这个值吗?

php的话, 自己做会话管理,用什么方法合适,数据库吗?还是文件形式,哪种效率高,我是个人开发者,没有团队经验

6 回复

谢谢, 非常详细。

光要sessionId 不要 Authorization 这个字段 ,可以吗

谢谢,大概明白了,不过这个sessionId每次都要带上的话,你们都是怎么做的,包装一个函数吗,  小程序怎么写一个  公共用的函数

小程序登录流程:

第一步:

前端:

        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

})

}

}

})

}

回到顶部