微信静默注册
- 小程序获取微信code(wx.login)发送给后端
- 后端通过code获取到用户在微信体系内的openId和unionId
- 后端通过openId或unionId查看是否在数据库中存在此用户,有则提示用户已注册, 无则执行创建用户逻辑
- 后端创建用户成功,返回accessToken, refreshToken,用户id和用户角色信息
微信静默登录
- 小程序获取code(wx.login)发送给后端
- 后端通过code获取到用户在微信体系内的openId和unionId
- 后端通过openId或unionId查看是否在数据库中存在此用户,无则提示用户需要注册,有则执行下一步
- 后端用户获取数据库中用户信息,返回accessToken, refreshToken,用户id和用户角色信息
新用户注册并登录
微信静默登录 --> 微信静默注册 --> 保存accessToken/refreshToken到本地
老用户Token过期
小程序调用后端API请求返回未授权错误
- 如果本地有userId说明用户以前登录过,尝试用refreshToken去获取新的accessToken
- 如果refreshToken获取accessToken失败,尝试微信静默登录
- 将新的accessToken和refreshToken保存下来
AccessToken过期处理思路
1. 拦截API请求返回未授权错误,直接跳转到用户登录页面,用户点击登录按钮触发老用户Token过期
逻辑, 所有逻辑处理完后返回之前页
小程序页面
async login(){
// 执行老用户Token过期逻辑
auth();
},
javascript
//老用户token过期逻辑
function auth(){
// 无用户ID信息,尝试wxmpSilentLogin
let ret;
if(!this.state.userInfo.userId){
ret = await this.dispatch("wxmpSilentLogin");
}else{
// 有用户信息,首先尝试refreshToken, 用refreshToken->accessToken
ret = await this.dispatch('wxmpSilentRefresh')
}
if(ret === WxmpError.UserNotRegistered) {
wx.redirectTo({ url: '/pages/public/register_userinfo'})
}
}
2. 小程序拦截未授权错误,记录当前页的URL和请求参数信息,触发老用户Token过期
逻辑,执行完成后重载该页面
case 401:
// 未授权,未登录过或者accessToken过期
console.log("http error: 401");
// 记录中断的页面,在登录完成后该页面需要重新加载
let pages = getCurrentPages();
let currPage = pages[pages.length - 1];
if(currPage){
wx.setStorageSync('breakPage', currPage.$page.fullPath)
}
// 执行老用户Token过期逻辑
auth()
// 无用户ID信息,尝试wxmpSilentLogin
let ret;
if(!this.state.userInfo.userId){
ret = await this.dispatch("wxmpSilentLogin");
}else{
// 有用户信息,首先尝试refreshToken, 用refreshToken->accessToken
ret = await this.dispatch('wxmpSilentRefresh')
}
if(ret === WxmpError.UserNotRegistered){
wx.redirectTo({ url: '/pages/public/register_userinfo'});
return;
}
const breakPage = uni.getStorageSync("breakPage")
console.log("after login, will redirect to:", breakPage)
// 完成后重新进入首页
const tabPages = ['/pages/index/index', '/pages/cart/cart', '/pages/user/user']
const isTabPage = tabPages.some(item=>(breakPage.indexOf(item)==0))
if(isTabPage){
console.log("switch tab", breakPage.substr(1))
wx.switchTab({
url: "index",
})
}else{
console.log("redirect to")
wx.redirectTo({
url: breakPage,
})
}
}