一,基本过程
要实现的方式是甲小程序跳转乙小程序,并且乙小程序免登录。
具体的实现跳转过程,这篇博客已经讲得很详细了:https://blog.csdn.net/weixin_42349568/article/details/116937196
二,基本免登录的流程
三,代码细节
1,跳转到指定页面后发起第一个请求(有session的话,说明已经登陆)
var obj = {
session_3rd: that.session_3rd,
sid: that.sid,
}
var res = await that.$api.postForm('/shop', obj)
2,然后到封装的api请求处看:
// 封装请求
const request = (method, url, options) => {
let methods = '';
let headers = {};
switch (method) {
case 'get':
methods = 'GET'
headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
}
break;
case 'post':
methods = 'POST'
headers = {
'Content-Type': 'application/json; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
}
break;
case 'postForm':
methods = 'POST'
headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest'
}
break;
}
let obj = {},
hideLoading = false,
loadingText = '正在加载...';
if (options) { //如果有options
if (options.hideLoading) {
hideLoading = options.hideLoading
delete options.hideLoading
}
if (options.loadingText) {
loadingText = options.loadingText
delete options.loadingText
}
}
return new Promise((resolve, reject) => {
!hideLoading && uni.showLoading({
title: loadingText,
// #ifndef MP-ALIPAY
mask:true,
// #endif
})
uni.request({
url: `${base.BASE_URL}${platform}${url}`,
method: methods,
data: dataObj(url, options),
header: headers,
success: res => {
util.checkError(res, resolve, reject)
},
fail: e => {
util.checkError(e, resolve, reject)
},
complete: () => {
uni.hideLoading()
}
})
})
}
主要是这行,也就是需要校验结果
success: res => {
util.checkError(res, resolve, reject)
},
3,然后进入校验的代码查看具体的校验代码:
const checkError = (res, resolve, reject) => {
if (res) {
if (res.statusCode == '404' || res.statusCode == '500' || res.statusCode == 404) {
uni.redirectTo({
url: '/pages/404/404'
})
} else if (res.data) {
if (res.data.code) {
if (res.data.code == "10002") {
// #ifndef H5
var err = uni.getStorageSync('err');
console.log('10002错误码', err)
if (!err) {
goLogin();
uni.setStorageSync('err', res.data.code);
console.log('拦截请求登录');
}
// #endif
// #ifdef H5
goLogin();
// #endif
reject(res);
这里只是截取的一部分相关代码,如果没有session,就会走10002这边,调用goLogin():
//未授权,请重新登录(10002)
const goLogin = async () => {
let redirect = await getCurPageUrl()
let redirectUrl = ''
if (redirect && redirect.indexOf("redirect=") == -1) {
redirectUrl = redirect
if (redirect.indexOf("?") != -1) { //如果url作为参数,后面还拼接参数,会导致后面的参数无法拿到,所以要把’?‘先转成“&”
redirectUrl = redirect.replace("?", "&");
}
// #ifndef H5
console.log('redirectUrl', redirectUrl)
miniLogin(redirectUrl);
// #endif
}
}
const getCurPageUrl = () => { //获取当前页面url包括参数
var pages = getCurrentPages(); //获取加载的页面
var currentPage = pages[pages.length - 1]; //获取当前页面的对象
console.log('currentPage', currentPage)
if (!currentPage) {
setTimeout(function() {
getCurPageUrl(); //没有拿到页面延时1000重新执行
}, 1000)
} else {
var url = currentPage.route; //当前页面url
var options = currentPage.options; //获取url中所带的参数
//拼接url的参数
var currentPageUrl = url + '?';
for (var key in options) {
var value = options[key]
currentPageUrl += key + '=' + value + '&';
}
currentPageUrl = currentPageUrl.substring(0, currentPageUrl.length - 1);
console.log('curpage', currentPageUrl);
return Promise.resolve(currentPageUrl);
}
}
对应的miniLogin():
const miniLogin = (curPageUrl) => {
uni.login({
success: async function(loginRes) {
console.log(loginRes);
var obj = {
code: loginRes.code
};
try {
// #ifdef MP-WEIXIN
var res = await api.postFormNoCheck('/login', obj);
// #endif
if (res.data.code == '10004') {
//手机号不存在需前往登录页面获取手机号码并登录
if (curPageUrl.indexOf("phone=") != -1) {
uni.login({
success: async function(codeRes) {
var phone = curPageUrl.split('phone=')[1];
if (phone.indexOf('&') != -1) {
phone = phone.split('&')[0];
}
var tjObj = {
code: codeRes.code,
phone: phone
};
try {
var tjRes = await api.postFormNoCheck('/login/getTJHKPhone', tjObj);
if (tjRes.data.code == '10000') {
// 手机号绑定成功,重新加载当前页面
if (curPageUrl.indexOf("&") != -1) { //有转换过的带参数url要转换回去带问号拼接
curPageUrl = curPageUrl.replace("&", "?")
}
uni.redirectTo({
url: '/' + curPageUrl
})
}
} catch (err) {
console.log('err', err);
}
}
})
}
//老用户,登陆成功,有session返回
} else {
var session_3rd = res.data['session_3rd'];
if (session_3rd) {
uni.setStorageSync('session_3rd', session_3rd);
var userData = await api.postForm('/user/userMsg', {
session_3rd: session_3rd
});
uni.setStorageSync('user', userData.data.user);
var curPage = await getCurPage();
let redirect = curPageUrl;
if (curPageUrl.indexOf("&") != -1) { //有转换过的带参数url要转换回去带问号拼接
redirect = curPageUrl.replace("&", "?")
}
let redirectUrl = ''
if (redirect && redirect != "pages/order/orderList/orderList" &&
redirect !=
"pages/user/user/user" && redirect != "pages/index/index") {
redirectUrl = '/' + redirect
uni.redirectTo({
url: redirectUrl
})
}else if (redirect && redirect == "undefined") {
uni.redirectTo({
url: '/pages/404/404',
});
}
} else {
uni.hideLoading();
goLogin();
}
}
} catch (err) {
console.log('err', err)
}
}
})
}