一. 客户端app.js代码
App({
onShow: function () {},
onLaunch: function () {
this.loadToken();
this.checkToken()
},
globalData: {
token: null,
host: 'https://www.test.com',
},
loadToken: function (e) {
var token = wx.getStorageSync('token');
if (token) {
this.globalData.token = token
} else {
this.login();
}
},
login: function (callback) { // 定义 login 函数
// 尝试自动登录
wx.login({
success: function (res) {
if (res.code) {
// 获取用户信息
wx.getUserInfo({
success: function (userRes) {
var encryptedData = userRes.encryptedData;
//console.log("res.code=" + res.code + ",--------app.js(login),返回用户信息json------=" + JSON.stringify(userRes));
var iv = userRes.iv;
// 将code、encryptedData和iv发送到后台服务器进行验证和解密
wx.request({
url: getApp().globalData['host'] + '/login',
method: 'POST',
data: {
code: res.code,
encryptedData: encryptedData,
iv: iv
},
success: function (response) {
//console.log(response.statusCode); // 打印服务器响应的状态码
//console.log(response.data); // 打印服务器返回的响应数据
if (response.statusCode === 200) {
//console.log('自动登录成功' + JSON.stringify(response.data.userInfo));
// 将用户信息保存到全局App实例中
//console.log("token=" + response.data.token); // 打印服务器返回的响应数据
getApp().globalData.token = response.data.token;
getApp().globalData.userInfo = response.data.userInfo;
wx.setStorage({
key: 'token',
data: response.data.token,
success: function () {
console.log('--- 保存token到storage 成功');
}
});
// 进行其他初始化操作
// 调用其他初始化函数或跳转到其他页面等
} else {
console.error('自动登录失败');
// 处理自动登录失败的情况
}
},
fail: function (error) {
console.error('自动登录失败', error);
}
});
},
fail: function (userRes) {
console.error('获取用户信息失败', userRes);
// 处理获取用户信息失败的情况
}
});
} else {
console.error('获取用户登录态失败', res.errMsg);
return; // 处理获取用户登录态失败的情况
}
},
fail: function (error) {
console.error('wx.login()调用失败', error);
return; // 处理wx.login()调用失败的情况
}
});
},
checkToken: function () {
var token = this.globalData.token;
console.log('--------------------token=' + token);
if (token) {
// 发送请求验证 token
return new Promise((resolve, reject) => {
wx.request({
url: this.globalData.host + '/checkToken',
method: 'POST',
data: {
token: token
},
success: function (response) {
if (response.statusCode === 200) {
if (response.data.success) {
console.log('Token 有效');
return;
} else {
console.error('Token 无效ABC');
return getApp().login() // Token 无效,调用 login 函数获取新的 token
}
}
},
fail: function (error) {
console.error('Token 验证失败', error);
return getApp().login() // Token 验证失败,调用 login 函数获取新的 token
}
});
setTimeout(() => {
console.log("异步函数执行完毕");
resolve();
}, 500);
});
} else {
console.error('Token 不存在'); // 不存在,调用 login 函数获取的 token
return new Promise((resolve, reject) => {
this.login()
setTimeout(() => {
console.log("异步函数执行完毕");
resolve();
}, 500);
});
}
},
});
二. 客户端调用代码
this.checkToken().then(() => { // 使用Promise确保在异步函数执行完毕后执行下一个语句
const d = {
token: this.globalData.token, //一定要在then()内,引用这个token,否则,会把旧的token传递进来,引起混乱
action: action,
key: key,
value: value
};
//console.log("-------monday= " + JSON.stringify(d));
wx.request({ //console.log("异步函数执行后继续");
url: this.globalData['host'] + '/week/save',
method: 'POST',
data: JSON.stringify(d),
success: function (response) {
if (response.statusCode === 200) {
console.log(action + " key '" + key + "' 到远程redis成功");
} else {
console.error(action + " key '" + key + "' 到远程redis失败", response.statusCode);
}
},
fail: function (error) {
console.error(action + " key '" + key + "' 到远程redis失败", error);
}
});
});
三. 服务端代码思路
1)在初始客户端登录时,在服务端接收到客户端传来的3个参数(,iv,encryptedData ,code),通过微信类,解析出微信用户的user_openid,然后新生成一个token字符串,将2者对应关系,存入到服务端的redis或者mysql,然后下发这个token。
2)客户端每次向服务端传递用户身份时时,都要发送这个token,服务端取出微信user_openid,保存处理相关业务逻辑数据。
3)服务端也要编写checkToken()函数和客户端的checkToken()函数对应。
4212

被折叠的 条评论
为什么被折叠?



