小程序
小游戏
企业微信
微信支付
扫描小程序码分享
那个3rd_session 这个是自己生成的, 回传给客户端,但是客户端请求的时候都是怎么带上这个参数的呢?包装一个函数,每次都带上这个值吗?
php的话, 自己做会话管理,用什么方法合适,数据库吗?还是文件形式,哪种效率高,我是个人开发者,没有团队经验
6 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
小程序登录流程:
第一步:
前端:
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不存在或已过期,也就说明当前登录无效,返回状态码到前端,前端根据状态码处理,根据实际需求判断是否需要重新登录。
以上是微信小程序登录的全部流程。
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
您好,请问wx.login在哪个地方调用呢?在app.onLaunch中调用吗?
一般情况都有注册,我们的程序要求手机号来注册,用户也可以自己输入手机号和验证码进行注册,可以使用微信手机号直接开通(此次讨论的情况)。 可以使用手机号来登录,也可以使用微信来登录。
思路一: 1.注册的话,如果直接使用微信手机号使用getPhoneNumber,这个时候需要
getPhoneNumber(e){
wx.login({
wx.request({
//带上code和加密的手机号,去自己的服务器请求,进行注册。
})
2.登录的话,是在onLaunch中调用wx.login 按照您说的流程,这个时候是不是还要更新服务器上的sessionkey?因为每次获取的code,sessionkey都会变更。
思路二:
直接就使用您登录的流程,把第一次获取到的code(5分钟内)记录下来,如果在后台没有发现该用户没有注册,提示需要注册,用户注册的时候使用code进行解密手机号注册。
或者有更好的思路吗?
很详细了,谢谢。但是我也在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
谢谢,大概明白了,不过这个sessionId每次都要带上的话,你们都是怎么做的,包装一个函数吗, 小程序怎么写一个 公共用的函数
可以
谢谢, 非常详细。
光要sessionId 不要 Authorization 这个字段 ,可以吗
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
小程序登录流程:
第一步:
前端:
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不存在或已过期,也就说明当前登录无效,返回状态码到前端,前端根据状态码处理,根据实际需求判断是否需要重新登录。
以上是微信小程序登录的全部流程。
您好,请问wx.login在哪个地方调用呢?在app.onLaunch中调用吗?
一般情况都有注册,我们的程序要求手机号来注册,用户也可以自己输入手机号和验证码进行注册,可以使用微信手机号直接开通(此次讨论的情况)。 可以使用手机号来登录,也可以使用微信来登录。
思路一: 1.注册的话,如果直接使用微信手机号使用getPhoneNumber,这个时候需要
getPhoneNumber(e){
wx.login({
wx.request({
//带上code和加密的手机号,去自己的服务器请求,进行注册。
})
})
}
2.登录的话,是在onLaunch中调用wx.login 按照您说的流程,这个时候是不是还要更新服务器上的sessionkey?因为每次获取的code,sessionkey都会变更。
思路二:
直接就使用您登录的流程,把第一次获取到的code(5分钟内)记录下来,如果在后台没有发现该用户没有注册,提示需要注册,用户注册的时候使用code进行解密手机号注册。
或者有更好的思路吗?
很详细了,谢谢。但是我也在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
})
}
}
})
}
谢谢,大概明白了,不过这个sessionId每次都要带上的话,你们都是怎么做的,包装一个函数吗, 小程序怎么写一个 公共用的函数
可以
谢谢, 非常详细。
光要sessionId 不要 Authorization 这个字段 ,可以吗