小程序--用户授权并登陆

2018-07-17  本文已影响133人  反者道之动001

const UserInfoKey = 'userInfoData'

wx.Http = Http
wx.Cos = Cos
wx.UserInfoKey = UserInfoKey

App({
  onLaunch () {
    /***   授权检查 *****/
    function isEmptyObject(e) {
        var t
        for (t in e)
            return !1
        return !0
    }
    wx.getSetting({
      success: (res) => {
        const authSetting = res.authSetting
        console.log('---authSetting---')
        console.log(authSetting)
        // 第一次授权
        if (isEmptyObject(authSetting)) {
            console.log('首次授权')
            this.goToQxPage(null)
            return
        // 非第一次授权
        } else {
          // 用户未授权
          if (authSetting['scope.userInfo'] === false) {
            this.goToQxPage(null)
            return
          // 用户以授权
          }else{
            // 检测是否已经获取到了授权    TODO 过期处理
            const data = wx.getStorageSync(UserInfoKey)
            console.log('---已储存的用户数据---')
            console.log(data)
            if(data){
              return
            }
            // 再次检测
            this.getUserInfo()
          }
        }
      }
    })
  },
  goToQxPage: (e) => {
    console.log('---错误信息---')
    console.log(e)
    console.log('--Go to qx page ----')
    wx.redirectTo({
      url: '/pages/getQx/index'
    })
  },
  getUserInfo() {
    
    wx.login({
      success: login_res => {
        //获取用户信息
        wx.getUserInfo({
          success: (res) => {
            console.log('--get user info res--')
            console.log(res)
            const datas = { code: login_res.code, encryptedData: res.encryptedData, iv: res.iv, store_id: '1' }
            
            wx.Http['com/login'](datas)
            (e => {
              wx.setStorageSync(UserInfoKey, e.msg)
            })

          },
          // 获取失败 重新授权
          fail: this.goToQxPage
        })
      }
    })
      
  }
})

今天看到有一个喜欢, 然后发现这个代码比较老旧, 不过是常规写法, 可以直接使用, 我这里附上优化后得代码(使用了xstream)


export default function (){
    wx.xs.user.setting()
        .map(e => e.authSetting)
        .subscribe({
            next: e => {
                console.log('-----authSetting----')
                console.log(e)
                // 第一次授权
                if (wx._.isEmptyObject(e)) {
                    console.log('首次授权')
                    this.goToQxPage(null)
                    return
                }
                // 用户未授权
                if (e['scope.userInfo'] === false) {
                    this.goToQxPage(null)
                    return
                }
                // 检测是否已经获取到了授权  
                const data = wx.getStorageSync(wx.UserInfoKey)
                console.log('---已储存的用户数据---')
                console.log(data)
                if(!data){
                    this.goToQxPage(null)
                    return
                }
            },
            error: err => console.error(err)
        })
        
}

--OK--

顺便上登陆得代码


//获取用户信息
// wx.Http.user['user/index/logintest']({
//   code: login_res.code
// })(e => {
//   console.log(e)
// })
// return

export default function getUserInfo (cb) {

  let UserInfoKey = wx.UserInfoKey
  let loginConstParams = {
   马赛克
  }
  
  let handleLogin = async loginPar => {
        wx.xs.fromPromise(wx.Http.user['com/login'](loginPar.params)())
          .debug(e => {
            console.log('---授权结果---')
            console.log(e)
            if(typeof e.msg !== 'object' || typeof e.msg.token !== 'string'){
              throw new Error('msg结果错误')
            }
          })
          .subscribe ({
            next: loginResult => {
              wx.setStorageSync(UserInfoKey, {
                ...JSON.parse (loginPar.info.rawData),
                ...loginResult.msg,
              })
              cb && cb ()
              wx.hideLoading ()
            },
            error: err => {
              console.log(err)
              wx.hideLoading ()
            }
        })
  }

  wx.showLoading ({title: '授权中'})
  wx.xs
    .combine (wx.xs.user.login (), wx.xs.user.info ())
    .map (([login_res, info]) => ({
      info,
      params: {
        code: login_res.code,
        encryptedData: info.encryptedData,
        iv: info.iv,   
        ...loginConstParams,  
      } 
    }))
    .debug (e => {
      console.log ('---授权请求数据--')
      console.log (e)
    })
    .subscribe ({
        next: handleLogin,
        error: err => {
            console.error (err)
            // 这步不能省略, 要明确保证工作环境是干净的
            wx.clearStorageSync()
            wx.hideLoading ()
        },
    })
}

上一篇下一篇

猜你喜欢

热点阅读