微信小程序跳转微信小程序实现免登录

一,基本过程

要实现的方式是甲小程序跳转乙小程序,并且乙小程序免登录。
具体的实现跳转过程,这篇博客已经讲得很详细了: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)
			}
		}
	})
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值