用户分为两类:没有注册的用户,已经注册的用户
如何检测?首先需要触发用户点击,这里使用button按钮
?
user.vue?
<button @click="getuserinfo()" class="btn">登录 / 注册</button>
js 处理用户触发事件,调用getUserProfile获取用户信息,每次请求都会弹出授权窗口,用户同意后返回 userInfo。调用uni.login 返回用户登录凭证code码,将获取到的userlnfo、code参数传递给后端接口,接口返回状态码判断用户是否已经注册过了...................
getuserinfo(e) {
let that = this;
if (that.preventClick) {
that.preventClick = false; //防止用户重复点击弹出授权窗口
wx.getUserProfile({
desc: '用于完善用户资料',
lang: 'zh_CN',
success: (res) => {
//console.log(res);
that.preventClick = true;
uni.login({
provider: 'weixin',
success: function(loginRes) {
var user_info = JSON.stringify(res['userInfo']); //获取 getUserProfile API返回的用户信息
uni.setStorageSync('zc_userinfo', user_info); //将用户信息缓存在本地
uni.request({
header: {
'content-type': 'application/x-www-form-urlencoded'
},
url: '接口地址',
method: '接口类型',
data: {
code: loginRes['code'], //login API返回用户登录凭证。开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息
user_info: user_info, // code 和 userinfo 一起传参数回去给后台接口
},
success: function(res3) {
//console.log(res3);
if (res3.data.code == 0) { //根据接口返回的code码判断用户是否已经注册过了,(返回的code码和后端工程师商量好统一返回)
that.login(res3.data.data); //登录成功代表用户已经注册过了,代表数据库能查询到用户信息,这时候可以调用vuex.login()缓存用户信息、登陆状态
uni.showToast({
title: '登录成功',
duration: 1000
});
setTimeout(function() {
//跳转页面后自动刷新
uni.switchTab({
url: '/pages/user/user',
success: function(e) {
var page = getCurrentPages().pop();
if (page == undefined || page == null){
return;
} else {
page.onLoad();
}
}
});
}, 200);
} else if (res3.data.code == -2) { //代表用户没有注册过,数据库查询不到相关信息,弹窗要求用户点击注册按钮
that.shows = "block";
} else { //其他原因登录失败
uni.showToast({
title: '授权登录失败!',
mask: true,
icon: 'none'
})
}
}
})
}
});
},
fail: (res) => { //接口调用失败的回调函数
//console.log(res)
that.preventClick = true;
}
})
}
},
如果用户没有注册过,弹窗要求用户点击按钮进行注册
使用button按钮 设置获取用户手机号,可以从@getphonenumber回调中获取到用户信息
<button class="popup_button" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" ?? ??? ??? ??? ??? ?lang="zh_CN">点击注册</button>
js调用uni.login 获取登录凭证 code,使用 code 换取 openid 和 session_key 等信息
使用encryptedData、iv、session_key换取手机号码,检查手机号码是否为合法的11位数字....
注册成功调用vuex.login()缓存用户信息、登陆状态
//小程序登录获取手机号码注册
getPhoneNumber: function(e) {
//console.log(e)
var that = this;
if (e.detail.errMsg != "getPhoneNumber:ok") {
uni.showModal({
title: '提示',
showCancel: false,
content: '未授权',
success: function(res) {}
})
} else {
//调用接口获取登录凭证
uni.login({
provider: 'weixin',
success: function(loginRes) {
//console.log(loginRes)
//获取到的code
var code = loginRes.code;
//获取openid
uni.request({
header: {
'content-type': 'application/x-www-form-urlencoded'
},
url: '接口地址',
method: '接口类型',
data: {
code: code, //login API返回用户登录凭证。开发者需要在开发者服务器后台,使用 code 换取 openid 和 session_key 等信息
},
success: function(res) {
//console.log(res)
var res = JSON.parse(res.data);
var se_key = res.session_key;
var encryptedData = e.detail.encryptedData;
var iv = e.detail.iv;
var openid = res.openid;
var unionid = res.unionid;
//换取手机号
uni.request({
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
url: '接口地址',
method: '接口类型',
data: {
encryptedData: encryptedData,
iv: iv,
se_key: se_key
},
success: function(res2) {
//console.log(res2)
var res2 = JSON.parse(res2.data);
if (res2.phoneNumber != "") {
var phoneNumber = res2.purePhoneNumber;
that.phone = phoneNumber;
var cellPhone = /^\d{11}$/;
if (!cellPhone.test(that.phone) || that.phone.length != 11 || that.phone.length == 0) {
uni.showToast({
title: '手机号获取失败,请重新登入或者联系管理员~',
duration: 2000,
icon: "none"
})
return;
} else {
//拿到手机号码开始注册
uni.request({
header: {
'content-type': 'application/x-www-form-urlencoded'
},
url: '接口地址',
method: '接口类型',
data: { //接口需要的数据
code: code,
binding: that.phone,
openid: openid,
unionid: unionid,
session_key: se_key,
user_info: uni.getStorageSync('zc_userinfo'),
//..............
},
success: function(res) {
//console.log(res)
//判断接口返回的状态码
if (res.data.code == 0) {
that.login(res.data.data); //注册成功,这时候可以调用vuex.login()缓存用户信息、登陆状态
uni.showToast({
title: '注册成功',
duration: 1000
});
that.shows ="none"; //关闭弹窗
setTimeout(function() {
uni.switchTab({
url: '/pages/user/user',
success: function(e) {
var page = getCurrentPages().pop();
if (page == undefined || page == null) {
return;
} else {
page.onLoad(); //跳转页面后自动刷新
}
}
});
},500);
} else if (res.data.code == -1) { //注册失败 根据接口返回的状态码做出判断,弹窗提示信息
that.code = "";
uni.showToast({
title: res.data.msg,
mask: true,
icon: 'none'
})
} else if (res.data.code == -2) {
that.mobile = "";
uni.showToast({
title: res.data.msg,
mask: true,
icon: 'none'
})
} else {
uni.showToast({
title: res.data.msg,
mask: true,
icon: 'none'
})
}
}
})
}
} else {
that.phone = '';
}
}
})
},
});
}
});
}
},
官方文档:https://uniapp.dcloud.net.cn/api/plugins/login
|