微信小程序登录注册逻辑和场景

微信静默注册

  1. 小程序获取微信code(wx.login)发送给后端
  2. 后端通过code获取到用户在微信体系内的openId和unionId
  3. 后端通过openId或unionId查看是否在数据库中存在此用户,有则提示用户已注册, 无则执行创建用户逻辑
  4. 后端创建用户成功,返回accessToken, refreshToken,用户id和用户角色信息

微信静默登录

  1. 小程序获取code(wx.login)发送给后端
  2. 后端通过code获取到用户在微信体系内的openId和unionId
  3. 后端通过openId或unionId查看是否在数据库中存在此用户,无则提示用户需要注册,有则执行下一步
  4. 后端用户获取数据库中用户信息,返回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,
        })
    }
}

3. 小程序设置一个定时器,定时检查token的过期时间是否接近,如果过期时间接近了主动触发老用户Token过期逻辑

4. 小程序设置相对较长的accessToken过期时间, 小程序每次进入时,主动触发老用户Token过期逻辑,尝试延长accessToken的过期时间,如果API请求返回未授权错误,执行第一种逻辑

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇