微信原生小程序封装用户登陆

场景:

后端在用户登陆后会返回resfreshToken和token;

open-type是小程序中button的属性之一,合法霍倩倩getUserInfo,引导用户授权,可以从bindgetuserinfo回调中获取到用户信息。button可以指定plain属性,完全去掉样式,跟view类似。

封装的登陆文件(user.js)
javascript 复制代码
/**
 * 用户相关服务
 */

/**
 * Promise封装wx.checkSession
 */
function checkSession() {
  return new Promise(function(resolve, reject) {
    wx.checkSession({
      success: function() {
        resolve(true);
      },
      fail: function() {
        reject(false);
      }
    })
  });
}

/**
 * Promise封装wx.login
 */
function wxlogin() {
  return new Promise(function(resolve, reject) {
    wx.login({
      success: function(res) {
        if (res.code) {
          resolve(res);
        } else {
          reject(res);
        }
      },
      fail: function(err) {
        reject(err);
      }
    });
  });
}

/**
 * 判断用户是否登录
 */
function checkIndex(){
  console.log(wx.getStorageSync('token'))
  if(!wx.getStorageSync('token')){
    console.log("11")
    wx.navigateTo({
      url: 'pages/auth/login/login',
    })
    console.log("12")
  }
}

function checkLogin() {
  return new Promise(function(resolve, reject) {
    if (wx.getStorageSync('token')) {
      checkSession().then(() => {
        resolve(true);
      }).catch(() => {
        reject(false);
      });
    } else {
      console.log("跳转")
      wx.navigateTo({
        url: '../pages/auth/login/login',
      })
      reject(false);
    }
  });
}

module.exports = {
  checkLogin,
  checkIndex,
  wxlogin
};
封装微信的网络请求(util.js)
javascript 复制代码
/**
 * 封封微信的的request
 */
function requestForCheckLincense(url, data = {}, method = 'GET') {
  return new Promise(function (resolve, reject) {
    wx.request({
      url: url,
      data: data,
      method: method,
      header: {
        'Content-Type': 'application/json',
        Authorization: 'dowsure' + wx.getStorageSync('token').token
      },
      success: function (res) {
        console.log('response--', res)
        res = res.data
        if (res.code == 200 || res.code == 0) {
          resolve(res)
        } else {
          if (res.code == 401) {
            showErrorToast('登录已失效,请重新登录')
            wx.removeStorageSync('token')
            // 登录失效
            // 切换到登录页面
            wx.reLaunch({
              url: '/pages/commonLoan/commonIndex/commonIndex'
            })
          } else {
            res.message = res.message || res.msg || '网络异常'
            showErrorToast(res.message)
            reject(res)
          }
        }
      },
      fail: function (err) {
        reject(err)
      }
    })
  })
}
代码使用
javascript 复制代码
点击登陆按钮
goLogin() {
    var refreshToken = wx.getStorageSync('refreshToken')
    if (refreshToken) {
      // 如果登陆过,刷新token;
      this.rToken(refreshToken)
    } else {
      this.setData({
        showLogin: true
      })
    }
  },

点击自己写的按钮然后打开登陆的弹窗
<van-popup
  position="bottom"
  custom-style="height:25%;background:linear-gradient(95deg, #F8FCFF -0.03%, #EDF5FF 64.44%, #F8FCFF 133.06%);"
  round
  show="{{ showLogin }}"
  bind:close="onLoginClose"
>
微信提供的open-type
  <button open-type="getPhoneNumber" class="wx-login-btn wx-btn" bindgetphonenumber="wxLogin">
    手机号快捷登录
  </button>
  <checkbox-group
    bindchange="checkboxChange"
    class="certificate"
    style="width: 90%; margin: 24rpx 40rpx"
  >
    <checkbox checked="{{isagree}}" class="checkbox" value="{{isagree}}"></checkbox>
    <view class="certificate-txt"
      >阅读并同意<text class="txt" bindtap="openUrl" data-num="lending003"
        >《风险提示与免责声明》</text
      >、<text class="txt" bindtap="openUrl" data-num="lending008"
        >《服务协议》</text
      ></view
    >
  </checkbox-group>
</van-popup>
javascript 复制代码
  //登录
  wxLogin(e) {
    if (e.detail.errMsg && e.detail.errMsg.indexOf('user deny') !== -1) {
      return
    }
    if (!this.data.isagree) {
      return util.showErrorToast('请勾选协议')
    }
    wx.getUserInfo({
      desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
      success: res => {
        wx.setStorage({
          key: 'userInfo',
          data: {
            nickName: res.userInfo.nickName,
            avatarUrl: res.userInfo.avatarUrl
          }
        })
        this.doLogin(e.detail)
      },
      fail: () => {
        util.showErrorToast('微信登录失败')
      }
    })
  },
javascript 复制代码
  doLogin: function (obj) {
    user
      .checkLogin()
      .then(() => {
        this.login(obj)
      })
      .catch(() => {
        this.login(obj)
      })
  },
  // 微信授权一键登录
  login: function (obj) {
    const _this = this
    wx.showLoading()
    util
      .request(
        login.getPhoneNum, {
          code: obj.code,
          source: '传入值' || '默认值',
          sourceCode: '传入值' || '默认值'
        },
        'GET'
      )
      .then(res => {
        wx.setStorage({
          key: 'token',
          data: {
            token: res.token.token,
            phone: res.username
          },
          success: function () {
           
            自己的操作
            // 获取code,以便后台获取唯一的openID
            _this.sendCodeForOpenId()
          }
        })
        if (res.refreshToken) {
          wx.setStorage({
            key: 'refreshToken',
            data: res.refreshToken
          })
        }
      })
      .catch(err => {})
  },
  // 获取code,以便后台获取唯一的openID
  async sendCodeForOpenId() {
    user.wxlogin().then(result => {
      util
        .request(
          login.setBackCodeForOpenId, {
            openId: result.code
          },
          'GET'
        )
        .then(res => {
          this.setData({
            showLogin: false
          })
          登陆后续自己的操作
        })
    })
  },
相关推荐
狂炫冰美式5 分钟前
人均配了AI, 为什么公司还是没变快? 🤔 本质还是分布式系统问题
前端·后端·架构
乘风gg1 小时前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员2 小时前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
爱读源码的大都督2 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝2 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员2 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端
东风破_2 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript
ITOM运维行者3 小时前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端
monologues3 小时前
深入 Vue 3 源码:响应式系统的精妙设计与编译优化
前端
hunterandroid3 小时前
Paging 3 分页:从手动分页到声明式加载
前端