实现原理/步骤】
一、wx.login
(1)前端通过wx.login()获取登录凭证code,每次调用的code均不同,有效时间5分钟,每个code可验证一回
(2)前端通过wx.request(我这里是用封装好的request.login)将code发送给后端
(3)后端将appid,appSecret(密钥)和code发送给微信接口服务去校验登录凭证,成功后会返回session_key(会话信息记录)和openid(用户唯一标识)
ps:前面的 appid,appSecret(密钥)可以在微信公众号平台获取
(4)用户登录成功后,后端将openid和session_key保存,生成一个自定义登录态的token(令牌)响应回去给前端。
(5)通过token可以查询openid和session_key,前端将返回的token进行缓存,小程序下次请求只要携带着token就可以证明已经登录。
(6)在app.js中检测用户是否已经登录
pages/login/login.js
onLoad() {
wx.login({
// 调用接口获取登录凭证(code)
success: (Result) => {
// 向后台发起request.login请求,用code换取用户登录态信息openid,存储为token;
request.login({
code: Result.code
}).then((token) => {
// 存储用户登录态信息token
wx.setStorageSync('token', token)
}) .catch(error => {
console.log("换取登录态token失败:",error)
});
},
fail:(res)=> { console.log("获取登录凭证code失败!",res) }
})
},
App({
//配置全局变量(多页面使用)
globalData: {
// 登录信息
token: ''
},
// 登录检测:token
checkLogin() {
//全局变量或缓存中存在token,直接赋值,否则重新登录
var token = this.globalData.token
if (!token) {
token = wx.getStorageSync('token')
if (token) {
this.globalData.token = token;
} else {
wx.showToast({
title: '请登录',
icon: 'none'
})
setTimeout(() => {
wx.reLaunch({
url: '/pages/login/login',
})
}, 2000);
}
}
},
onLaunch() {
// 登录检测:token
this.checkLogin(),
},
})