3,143
社区成员
发帖
与我相关
我的任务
分享
// 判断token 是否过期
var tokenDate = wx.getStorageSync('tokenDate') || 'null';
console.log(tokenDate)
if (tokenDate == 'null') { // 如果为空的情况下 则去请求token 并缓存
wx.request({
url: 'http://api.hmxigou.com/api/5c22de286985d',
method: 'GET',
header: {
'Content-Type': 'application/json',
'version': 'v3.0'
},
data: {},
success: (res) => {
//定义当前时间戳
var timestamp = Date.parse(new Date());
//定义过期时间
var mytime = timestamp + 7200000; //2个小时
//存储token
//.... 请求成功回调
wx.setStorageSync('tokenDate', mytime); // token结束时间
wx.setStorageSync('access_token', res.data.data.access_token)
console.log(res)
console.log('过期时间为空时定义缓存')
console.log(wx.getStorageSync('access_token'));
},
fail: (res) => {
wx.showToast({
title: '网络异常',
duration: 2000
})
}
})
} else { // 有token 的情况下 判断token 是否有效
var nowDate = Date.parse(new Date());
var tokenEndTime = wx.getStorageSync('tokenDate');
//var endTime = new Date(tokenEndTime).getTime();
if (nowDate >= tokenEndTime) { // 如果过期则 更新 token & token 时间
//nowDate.setMonth(nowDate.getMonth() + 3);
wx.request({
url: 'http://api.hmxigou.com/api/5c22de286985d',
method: 'GET',
header: {
'Content-Type': 'application/json',
'version': 'v3.0'
},
data: {},
success: (res) => {
//定义当前时间戳
var timestamp = Date.parse(new Date());
//定义过期时间
var mytime = timestamp + 7200000; //2个小时
//存储token
//.... 请求成功回调
wx.setStorageSync('tokenDate', mytime); // token结束时间
wx.setStorageSync('access_token', res.data.data.access_token)
console.log(res)
console.log('缓存到期了')
//console.log(wx.getStorageSync('access_token'));
},
fail: (res) => {
wx.showToast({
title: '网络异常',
duration: 2000
})
}
})
}
}
}
[quote=引用 13 楼 it0_soft 的回复:] 自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. [quote=引用 12 楼 風灬雲 的回复:] qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. [quote=引用 12 楼 風灬雲 的回复:] qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
data: {},
success: (res) => {
that.globalData.access_token = res.data.data.access_token
},
fail: (res) => {
wx.showToast({
title: '网络异常',
duration: 2000
})
}
globalData: {
userInfo: null,
server: 'http://api.hmxigou.com/api/',
music_url: '',
access_token: ''
}
const app = getApp()
const access_token = app.globalData.access_token
我打印access_token居然是空值,在app.js里面没有对它修改吗?自己封装了个request请求,现在的需求是我怎么全局控制,比如我获取api的接口是http://xxx/api/5c22de286985d,根据这个地址去获取token有效时间是7200秒,把获取到的token在小程序端进行存储,然后在根据http://xxx/api/5c231c0781ade携带这个token去获取数据,现在的问题是token实效是7200秒,我怎么在小程序端token失效了进行刷新,现在我在app.js里封装了,这就导致只要有请求就不停的去刷新token,怎么才能在有需要的时候去获取token. qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
qcloud.setLoginUrl(config.service.loginUrl); 这个是微信小程序官方SDK用的;
为啥要定时获取……? 如果涉及身份验证,获取完token,最终还是要用openid/unionid去对比数据库,将用户身份写入session。session设置个时效(比如7天)不就好了吗?
wx.ajax({
url:"url",
method:"POST",
data:{},
success(){},
fail(){},
complete(){}
})
一般是后端的接口先验证token,如果失效就返回一个状态码表示token失效,小程序端封装request方法,只要返回码是自己定的token失效状态就重新请求获取token
onLaunch: function(q) {
qcloud.setLoginUrl(config.service.loginUrl);
wx.ajax = (options) => {
let opt = {};
opt.url = options.url;
options.data ? opt.data = options.data : null;
options.header ? opt.header = options.header : null;
options.method ? opt.method = options.method : null;
options.dataType ? opt.dataType = options.dataType : null;
options.responseType ? opt.responseType = options.responseType : null;
if (qcloud.Session.get()) {//这里获取本地token,如果本地存在token就带上
header["X-WX-SKEY"] = qcloud.Session.get().skey
}
for (let key in options.header) {
header[key] = options.header[key]
};
opt.header = header
opt.success = (res) => {
wx.hideLoading()
if(res.data.code===403){//假设定义403表示token失效
//这里进行重新获取token操作
}else{
if (typeof options.success === "function") {
options.success(res.data)
}
}
},
opt.complete = () => {
if (typeof options.complete === "function") {
options.complete()
}
},
opt.fail = (err) => {
if (typeof options.fail=== "function") {
options.fail()
}
//请求失败回调、提示网络错误操作
}
wx.showLoading({
title: '网络请求中...',
mask:true
})
wx.request(opt)
}
}
一种方式,第一次获取到token,在后台缓存,前端获取; 二钟方式,定时获取,刷新token;