微信小程序登入授权及请求接口封装
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
}