当前位置:网站首页 > 微服务架构 > 正文

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

一,基本过程

二,基本免登录的流程

在这里插入图片描述

三,代码细节

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) } } }) } 
到此这篇微信小程序跳转微信小程序实现免登录的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 时间排序处理在微信小程序和真机调试没问题,发布体验版后未执行2024-11-30 10:36:05
  • unicloud生成微信小程序分享码2024-11-30 10:36:05
  • 《第一行代码》 第十章:服务2024-11-30 10:36:05
  • 微信的新版canvas绘制的图案发生变形和偏移的问题2024-11-30 10:36:05
  • jconsole远程连接centos7 服务器上的tomcat来查看服务器状况(无密码版)2024-11-30 10:36:05
  • 微信小程序跳转微信小程序的实现2024-11-30 10:36:05
  • 配置中心(微服务配置中心)2024-11-30 10:36:05
  • 关闭dhcp client(关闭dhcpclient服务)2024-11-30 10:36:05
  • 获取位置信息失败怎么解决(微信公众号获取位置信息失败怎么解决)2024-11-30 10:36:05
  • 模型训练服务器(模型训练服务器怎么选择)2024-11-30 10:36:05
  • 全屏图片