
注意,这里的session不是小程序维护的那个通过wxlogin()方法维护的session,而是我们自己的服务端的session。
由于正常情况下,客户端向服务端发起请求时,session信息是存放在cookie中以请求头的方式带回给服务端的,而请求头中具体的信息就是session的id,如下图所示
标红的就是我们需要在请求时携带返回给服务端的请求头 所以我们需要的就是这个JESSIONID的值了。刚好,微信小程序也提供了对请求头的支持。
解决办法:1、在用户登录时,服务端将用户的sessionId返回。
2、小程序保存sessionId,在之后的每次请求中在请求头中携带sessionId
服务端关键代码:
获取sessionId的方法,只要获得request对象就可以轻松获取到了
Sting sessionId = requestgetSession()getId();
把sessionId返回
//登录时的业务代码responsegetWriterwrite(sessionId); //把sessionId返回给前台
小程序端登录后,把sessionId存入全局变量,appjs中是个存放全局变量的好地方。
//登录后的逻辑处理
getApp()globalDataheaderCookie = 'JSESSIONID=' + _datasessionId;
appjs中代码
globalData:{
header:{'Cookie': ''} //这里还可以加入其它需要的请求头,比如'x-requested-with': 'XML>
小程序端请求时带上sessionId
var header = getApp()globalDataheader; //获取appjs中的请求头
wxrequest({
url: "localhost:8080/xx/xx",
header: header, //请求时带上这个请求头
success:function(res){
}
}
建议封装自己的请求信息,处理 一些通用的逻辑。
自定义函数求两个数组的和,要求在主函数中进行调用的方法: int fun(int a[],int na,int b[],int nb)//必须传入数组的大小,经过参数传递后,编译器已经不记得数组有几个元素了。sizeof(a)的值为4 { int sum=0; int i=0; for(;i
微信小程序获取用户信息的接口确实已经被封了,因此现在需要使用微信登录的方式进行用户身份验证和获取用户信息。在小程序中首先通过wxlogin()接口获取用户登录凭证code,然后在小程序后台配置开发者服务器地址和域名,在开发者服务器端使用code请求微信服务器获取openid和session_key等信息。之后就可以得到openid等用户信息并存储到开发者服务器端进行相关业务逻辑处理。同时需要注意需要在小程序中进行用户授权,以获取用户允许授权后的信息。
调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。
本文以抖音小程序(微信小程序获取流程和接口一模一样)为例,最近博主在做一个抖音小程序的小项目,前端在获取用户手机号的时候,需要调用 ttlogin 接口进行登录,登录后返回一个code,这个code有3分钟的失效时间,根据这个code可以获取到sessionKey,这个sessionKey类似于对称加密的密钥,会对用户信息进行加密。在获取用户信息的时候,前端
需要将 <button> 组件 open-type 的值设置为 getPhoneNumber。用户点击后会d出一个授权d窗让用户确认(若该用户账户未绑定手机号码会执行一次绑定手机号码的流程;授权d窗每次使用都会d出)。 用户同意后,开发者可以通过 bindgetphonenumber 事件回调获取到一个加密数据,开发者可以把该数据传回到自己的服务端进行解密获取手机号。
获取到的加密数据需要使用sessionKey进行解密,因此在获取用户信息前,需要登录一次,获取到code,然后根据code获取到sessionKey,再根据sessionKey进行加密数据的解密,解析出手机号。
根据博主猜测,抖音在登录后会生成一个code,和一个对应的sessionKey,在会话期间(session未过期)的时候获取用户信息,会将用户信息使用sessionKey进行数据的加密,进行数据的解密也需要使用到sessionKey。code和sessionKey是对应的,但是它们的失效期是不一样的,code的失效期是3分钟,sessionKey的失效时间是不定的,只要用户活跃在页面上都不会失效。在获取到code的3分钟内调用 code-2-session 接口,会获取到sessionKey,如果3分钟后根据code获取sessionKey将会获取失败,因此解密也会失败。
因为无法判断用户什么时候开始获取用户信息,所以用户一进入页面,前端就会调用 ttlogin 接口进行登录,然后放到localstorage缓存中,在用户点击按钮时,d出授权框用户确认后获取到用户信息的加密数据,然后前端将缓存的code和加密数据一并传给后端。后端用code先去调用 code-2-session 接口获取到sessionKey,然后以sessionKey为密钥进行AES解密,获取到手机号返回给前台。整个流程看起来没什么问题,但是一旦用户在页面停留时间超过3分钟,然后再去获取用户信息会失败,主要是因为code已经失效,获取sessionKey会失败。
目前的问题就是过了code的有效期后,根据code获取sessionKey失败。那么在前端login获取到code后,先缓存到本地,然后立即调用后台接口去获取sessionKey然后缓存到redis里面,key为code,value为sessionKey。失效时间根据自己的业务设置(小程序页面用户不会停留太久,因此缓存失效时间设置为30分钟),用户退出小程序后,会重新login,然后也会存一份新的code和sessionKey的对应值。
用户在授权到用户信息后,前端直接将缓存的code和加密后的用户信息上传到服务到进行解密。服务端根据code从缓存中先获取到sessionKey,然后再用sessionKey进行解密,解析出手机号进行返回。
以上解决办法每次基本都可以获取手机号成功,但是也会存在一些问题
UserInfoController主要提供两个接口,一个是解密手机号和code2seesion *** 作
TiktokEncryptedParam 主要是前端传过来的code和加密后的数据
TiktokUserInfoSPI 主要是对接口的封装
TiktokUserInfoSPIAdapter 实现接口
使用AES对称加密
getQueryVariable: function (variable) {
var query = windowlocationsearchsubstring(1);
var vars = querysplit("&");
for (var i=0;i<varslength;i++) {
var pair = vars[i]split("=");
if(pair[0] == variable){return pair[1];}
}
return '';
}
正常按url的参数提取就行了
以上就是关于微信小程序用户登录的全局变量是否有有效期全部的内容,包括:微信小程序用户登录的全局变量是否有有效期、微信小程序怎么使用code 换取 session、微信小程序现在获取用户信息接口都封了,怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)