以下总结如有不足地方请点出改进,大神请一笑尔过勿喷。
授权总结:
wx.checkSession 先判断是否是登录状态
若不是则
1、调用 wx.login 获取 code 将 3drsession 保存在本地(后面用于调用接口数据的凭证)
2、wx.getSetting 获取用户配置是否有获取用户信息
如果有就下一步 获取用户信息 wx.getUserInfo
如果没有 配置用户配置 调起授权 wx.authorize 后再获取用户信息 wx.getUserInfo
获取用户信息后可以将数据回传服务器保存
3、存在用户拒绝授权的情况下
用户拒绝在 wx.getUserInfo 的回调 fail 里面调起用户配置 wx.openSetting 配置成功 再去获取用户信息
若是则
校验 3drsession 是否合法
补丁
多加一个状态 isaotusel 检验本次获取信息是否获取到用户信息当为0时候 页面刷新重启始终调起用户授权
具体代码如下:
onLaunch: function () {
var obj =
this;
//判断用户登录
wx.checkSession({
success:
function () {
//session 未过期,并且在本生命周期一直有效
var rd3_session = wx.getStorageSync('3rd_session');
//校验 3drsession 是否合法
wx.request({
url:
'https://xxxx/api/index/check_3rdsession',
data: {
rd3_session: rd3_session
},
header: {
'content-type':
'application/json'
},
success:
function (res) {
// obj.checkaotu()
}
})
},
fail:
function () {
//登录态过期
obj.login_wx();
}
})
//
if (obj.globalData.isaotusel ==
0){
this.getuser();
}
},
//登录
login_wx() {
var obj =
this;
wx.login({
success: res => {
// 发送 res.code 到后台换取 openId, sessionKey, unionId
wx.request({
url:
'https://xxxx/api/index/onlogin',
data: {
code: res.code
},
header: {
'content-type':
'application/json'
},
success:
function (res) {
if (res.data.rd3_session !=
'') {
//获取到的3rd_session保存在本地
wx.setStorageSync(
'3rd_session', res.data.rd3_session)
//获取用户信息
obj.checkaotu();
}
}
})
}
})
},
// 判断是否同意授权过
checkaotu() {
var obj =
this;
//获取用户授权设置
wx.getSetting({
success: res => {
if (res.authSetting[
'scope.userInfo']) {
// 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
this.getuser();
}
else{
//没有配置授权,调起授权
wx.authorize({
scope:
'scope.userInfo',
success:res=>{
this.getuser();
}
})
}
}
})
},
//获取用户信息
getuser(){
var obj =
this;
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this.globalData.userInfo = res.userInfo
wx.request({
url:
'https://xxxx/api/index/setuserinfo',
data: {
info_json: JSON.stringify(res.userInfo),
rd3_session: wx.getStorageSync(
'3rd_session')
},
header: {
"Content-Type":
"application/x-www-form-urlencoded"
},
method:
"POST",
success:
function (res) {
//操作
obj.globalData.isaotusel =
1;
}
})
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (
this.userInfoReadyCallback) {
this.userInfoReadyCallback(res)
}
},fail(){
//用户拒绝则不然操作
wx.openSetting({ success: (res) => {
obj.getuser();
}});
}
})
},
globalData: {
userInfo:
null,
isaotusel:
0
},