一. 客户端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);
});
}
},
});
二. 客户端调用代码
console.log('---A- token=' + app.globalData.token);
app.checkToken().then(() => { // 使用Promise确保在异步函数执行完毕后执行下一个语句
console.log("异步函数执行后继续");
this.call_Func_Need_Valid_Token() #继续执行需要合法token的函数
});
三. 服务端代码思路
1)在初始客户端登录时,在服务端新生成一个token字符串和user_openId对应存入到数据库redis或者mysql,然后下发token。
2)客户端每次调用时,都要checkToken(),将小程序里传过来的token,在服务器里针对此token生成的微信user_openid,取出来,保存处理相关业务逻辑数据。