小程序——session登录流程总结

本文介绍了使用Taro框架开发微信小程序的登录流程和请求封装。首先,展示了如何封装小程序登录方法,包括获取code、刷新登录状态以及处理token。接着,详细说明了封装request请求的步骤,包括设置token、处理登录异常情况。最后,讨论了小程序启动时的登录检查,确保用户已登录或重定向到登录页面。此外,特别提醒了关于环境域名配置和cookie处理的注意事项。
摘要由CSDN通过智能技术生成

小程序登录流程

这里我们是使用Taro来开发小程序,Taro 是一个开放式跨端跨框架解决方案,支持使用React/Vue/Nerv 等框架来开发 微信 / 京东 / 百度 / 支付宝 / 字节跳动 / QQ / 飞书 小程序 / H5 / RN 等应用;Taro3.0中可以使用完整的React/Vue/Vue3/Nerv开发体验,具体请参考

这里我们使用React来开发小程序的登录流程

一、封装小程序登录方法

/src/utils/config.js

import Taro from '@tarojs/taro'
// 获取小程序环境版本
const { envVersion } = Taro.getAccountInfoSync().miniProgram;

const domainOptions = {
  develop: "https://*****",//开发版
  trial: "https://*****",//体验版
  release: "https://*****",//正式版
}
//不同环境的域名
export const DOMAIN = domainOptions[envVersion];
// token 名字
export const Authorization = 'token'

/src/utils/login.js

import Taro from "@tarojs/taro";
import { Authorization } from "./config";
import { getOpenId } from "../api";
/**
 * 重新登录
 */
export const userLogin = () => {
  return new Promise(async (resolve, reject) => {
    try {
      const res = await refreshLogin();
      resolve(res);
    } catch (err) {
      reject(err);
    }
  });
};

/**
 * 重新登录
 * token不存在或session失效时
 */
export const refreshLogin = () => {
  Taro.removeStorageSync(Authorization);
  return new Promise(async (resolve, reject) => {
    try {   
      const code = await getWxCode();
      // 通过调用后端接口,换取token
      const res = await getOpenId({ code });
      // 没有登录,去登录页面
      if (res.code == 1001) {
        Taro.redirectTo({ url: "/pages/user/login" });
        return;
      }
      resolve(res);
    } catch (err) {
      reject(err);
    }
  });
};

/**
 * 获取 小程序的code
 */
export const getWxCode = async () => {
  return new Promise((resolve) => {
    // 通过小程序的login接口获取小程序code,
    Taro.login({
      success(res) {
        if (res.code) {
          resolve(res.code);
        } else {
          Taro.showToast({
            title: "登录失败,请重新进入小程序",
            icon: "none",
            duration: 3000,
          });
        }
      },
    });
  });
};

二、封装request请求

/src/utils/request.js

import Taro from "@tarojs/taro";
import { Authorization, DOMAIN } from "./config";
import { userLogin } from "./login";

export const request = (params) => {
  return new Promise((resolve, reject) => {
    let { method = "POST", url, data = {}, header = {} } = params;
    let token = Taro.getStorageSync(Authorization);    
    console.log("请求参数:", params);
	// 设置token
    let defaultHeader = { Cookie: token };
    Taro.request({
      method,
      url: /^http(s?):\/\//.test(url) ? url : DOMAIN + url,
      data, //请求参数
      credentials: "include",
      header: Object.assign(defaultHeader, header), //相同header设置将覆盖默认
      success(res) {
        // 如果token不存在
        if (!token) {
          const cookie = res.cookies.find(item => item.includes('JSESSIONID='))
          Taro.setStorageSync(Authorization, cookie);
        }
        let { code } = res.data;
        
        if (code === 555) {
          // token失效,重新获取小程序code去后台换取token
          userLogin().then(() => {
            resolve(request(params));
          });
          return;
        } 
        resolve(res.data);
      },
      complete(res) {
        if (res.statusCode !== 200) {
          Taro.showToast({
            icon:'error',
            title: '网络出错啦!'
          })
        }
      },
      fail(err) {
        Taro.showToast({
          icon:'error',
          title: '网络出错啦!'
        })
        reject(err);
      },
    });
  });
};

为了防止有人采坑,这里需要重点注意下,

  • 如果develop和trial设置的地址和release一样,res.cookies的长度会有多个,如 [“acw_tc=xxxxx;path=/;HttpOnly;Max-Age=1800”, “JSESSIONID=xxxxxx; Path=/; HttpOnly”],
  • 否则只有一个[“JSESSIONID=xxxxxx; Path=/; HttpOnly”]

三、进入小程序时需要做的事情

import React, { Component } from "react";
import { Provider } from "react-redux";
import Taro, { getCurrentInstance } from "@tarojs/taro";
import { userLogin } from "@/utils/login";
import dva from "@/utils/dva";
import models from "./models/index";

// 这里集成了dva,想要了解Taro如何集成dva可以关注后续文章
const dvaApp = dva.createApp({
  initialState: {},
  models,
});
const store = dvaApp.getStore();

const rulePath = [
  "pages/user/login"
];

class App extends Component {
  constructor() {
    super(...arguments);
  }
  onLaunch(options) {
    Taro.clearStorageSync();
  }
  onShow(){
	const router = getCurrentInstance().router;
	// 如果当前页面是登录页面,直接return
    if (rulePath.includes(router.path)) {
      return;
    }
    const state = store.getState();
    const { isUpload } = state.global;
    // 在表单填写的时候,如果存在图片上传在onChange后会触发onShow生命周期,
    // 这里使用了dva状态管理去判断是否进行上传图片
    if (isUpload) {
      store.dispatch({ type: "global/getUploadStatus", payload: false });
      return;
    }
    // 用户登录
    userLogin().then((res) => {
      // 用户没有登录,跳转到登录页面
      if (res.code == 1001) {
        Taro.redirectTo({
          url: "/pages/user/login",
        });
        return;
      }
      // 获取用户信息
      if (res.code == 200) {
        store.dispatch({
          type: "global/getUserInfo",
          payload: res.result,
        });
      }
    });
  }
  render() {
    return <Provider store={store}>{props.children}</Provider>;
  }
}
export default App;

到这里小程序基于session登录机制基本算结束了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码猿小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值