实现原理/步骤】
一、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(), }, })