微信小程序登入授权及请求接口封装

微信小程序登入授权及请求接口封装

1.一般在做购物车页面,个人主页,加入购物车,点击收藏的时候都需要登入授权
2.一般需要登入授权的页面需要后端传递一个token值
3.什么是token:它是前端鉴权的一种方式,由后端生成,具有时效性

附上微信小程序登入官方地址:

https://developers.weixin.qq.com/miniprogram/dev/framework/openability/login.html

废话不说,直接上代码

封装好的请求接口文件
//api.js
var API_BASE_URL = 'server'
var subDomain = '专属域名'
//封装请求函数
let request = (url, needSubDomain, method, data) => {
  const _url = API_BASE_URL + (needSubDomain ? '/' + subDomain : '') + url
  return new Promise((resolve, reject) => {
    wx.request({
      url: _url,
      method: method,
      data: data,
      header: {
          //请求头
        'Content-Type': 'application/x-www-form-urlencoded'
      },
      success(request) {
        resolve(request.data)
      },
      fail(error) {
        reject(error)
      },
      complete(aaa) {
        // 加载完成
      }
    })
  })
}

/**
 * 小程序的promise没有finally方法,自己扩展下
 */
Promise.prototype.finally = function (callback) {
  var Promise = this.constructor;
  return this.then(
    function (value) {
      Promise.resolve(callback()).then(
        function () {
          return value;
        }
      );
    },
    function (reason) {
      Promise.resolve(callback()).then(
        function () {
          throw reason;
        }
      );
    }
  );
}
module.exports={
    //需要接受code值
    login_wx: (code) => {
    return request('url', true, 'post', {
      code,
      type: 2
    })
  },
     register_complex: (data) => {
    return request('url', true, 'post', data)
  },
    
}
通过触发bindgetuserinfo事件来获取userInfo
<button class="l" open-type="getUserInfo" bindgetuserinfo="processLogin">登入</button>
判断能否获取到用户信息,如果获取到了就去注册
//me.js  
const WXAPI = require('apifm-wxapi');
//引入封装的文件
const index = require('../../utils/index.js')
Page({
    processLogin(e) {
        //如果没有用户userInfo,也就是用户信息
        if (!e.detail.userInfo) {
          wx.showToast({
            title: '已取消',
            icon: 'none',
          })
          return;
        }

      //如果用userInfo,则调用register注册方法
    index.register(this);
	}
})
注册,登入,判断token时效期
//index.js

const WXAPI = require('apifm-wxapi')
//登入
async function login(page){
  const _this = this
  wx.login({
    success: function (res) {
      WXAPI.login_wx(res.code).then(function (res) {      
        if (res.code == 10000) {
          // 去注册
          //_this.register(page)
          return;
        }
        if (res.code != 0) {
          // 登录错误
          wx.showModal({
            title: '无法登录',
            content: res.msg,
            showCancel: false
          })
          return;
        }
        //存贮token,和uid
        wx.setStorageSync('token', res.data.token)
        wx.setStorageSync('uid', res.data.uid)
        if ( page ) {
          page.onShow()
        }
      })
    }
  })
}

//注册
async function register(page) {
  let _this = this;
  wx.login({
    success: function (res) {
      let code = res.code; // 微信登录接口返回的 code 参数,下面注册接口需要用到
      wx.getUserInfo({
        success: function (res) {
          let iv = res.iv;
          let encryptedData = res.encryptedData;
          let referrer = '' // 推荐人
          let referrer_storge = wx.getStorageSync('referrer');
          if (referrer_storge) {
            referrer = referrer_storge;
          }
          // 下面开始调用注册接口
          WXAPI.register_complex({
            code: code,
            encryptedData: encryptedData,
            iv: iv,
            referrer: referrer
          }).then(function (res) {
            console.log(res)
            _this.login(page);
          })
        }
      })
    }
  })
}

//检测token是否过期
//只检测登录态(检测微信返回)
async function checkSession(){
  return new Promise((resolve, reject) => {
      //通过内置方法检测
    wx.checkSession({
      success() {
        return resolve(true)
      },
      fail() {
        return resolve(false)
      }
    })
  })
}
// 总体检测登录状态,包括token和微信登录态 返回 true 或false

//在app.js的onload生命周期通过index.checkHasLogined调用,如果过期

async function checkHasLogined() {
  //获取本地存储的token
  const token = wx.getStorageSync('token')
  //如果没有token,直接返回false
  if (!token) {
    return false
  }

  //检测微信登录态
  /**
   * 调用成功说明当前 session_key 未过期,调用失败说明 session_key 已过期
   */
  const loggined = await checkSession()

  //如果没有登录态,则移除token,并返回false
  if (!loggined) {
    wx.removeStorageSync('token')
    return false
  }

  //检测登录token是否有效
  const checkTokenRes = await WXAPI.checkToken(token)

  //如果登录token无效,移除token并返回false
  if (checkTokenRes.code != 0) {
    wx.removeStorageSync('token')
    return false
  }
  
  //如果有token并且有效,并且微信登录态也有效则返回true
  return true
}

module.exports = {
  login: login,
  register: register,
  checkSession:checkSession,
  checkHasLogined:checkHasLogined
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值