小程序--用户授权并登陆
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 ()
},
})
}