微信小程序使用AES加密和解密

2023-11-18

前端请求后端接口进行参数加密处理:

const CryptoJs = require('crypto-js');
const defaultKey = "zoe_nurse_qazxr8"; // 默认的key
const defaultIv = "qwertyuiopasdfgh"; // 默认的key 偏移量

/**
 * 加密方法
 * @param: str 需要加密的字符
 * @param: key 密钥
 * @param: iv 密钥偏移量
 */
function encrypt(str, key, iv) {
    const keyStr = key ? encParse(key) : encParse(defaultKey);
    const ivStr = iv ? encParse(iv) : encParse(defaultIv);
    
    const encryptedStr = CryptoJs.AES.encrypt(str, keyStr, {
        iv: ivStr,
        mode: CryptoJs.mode.CBC,
        padding: CryptoJs.pad.Pkcs7
    });
    
    // 直接toString()是base64格式的字符串
    // ciphertext.toString() 是128位的字符串
    return encryptedStr.toString();
}
/**
 * 解密方法
 * @param: str 需要解密的字符
 * @param: key 密钥
 * @param: iv 密钥偏移量
 */
function decrypt(str, key, iv) {
    const keyStr = key ? encParse(key) : encParse(defaultKey);
    const ivStr = iv ? encParse(iv) : encParse(defaultIv);
    
    // 判断str是否为base64,如果不是就要转base64,是了就不能再转
    const flag = isBase64(str);
    if (!flag) {
        // 转为base64之前要先转16进制
        str = CryptoJs.enc.Hex.parse(str);
        // 只有base64格式的字符才能被解密
        str = CryptoJs.enc.Base64.stringify(str);
    }
    
    const encryptedStr = CryptoJs.AES.decrypt(str, keyStr, {
        iv: ivStr,
        mode: CryptoJs.mode.CBC,
        padding: CryptoJs.pad.Pkcs7
    });
    return encryptedStr.toString(CryptoJs.enc.Utf8);
}
/**
 * 处理密钥字符格式
 * @param: key 需要转格式的字符
 */
function encParse(key) {
    // key = CryptoJs.enc.Utf8.parse(key);
    return CryptoJs.enc.Latin1.parse(key);
}
/**
 * 使用MD5 hash字符串
 * @param: str 需要加密的字符串
 * @param: times 需要hash的次数
 */
function md5(str, times = 1) {
    for (let i = 0; i < times; i++) {
        str = CryptoJs.MD5(str).toString();
    }
    return str;
}
/**
 * 判断是否是Base64格式的字符串
 */
function isBase64(str) {
    let reg = /^(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=))|(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==))$/;
    return reg.test(str);
}

export default {
    decrypt,
    encrypt,
    md5
}

在request请求里使用

import api from './api';
import cryptoJs from './aes.js'

const APP_CONFING = api.getAppConfig();

/**
 * 登录拦截
 * @param {String} resolve 成功
 * @param {String} reject 失败
 * @param {String} data 返回数据
 * @return {function} promise
 */
function loginRequest(resolve, reject, data) {
    reject(data || '请先登录');
    let dataRouter = api.getRouterMin();
    if (dataRouter.router === '/pages/login/index') {
        api.removeStorage('Router');
        api.redirectPage('/pages/login/index')
    } else {
        api.setStorage('Router', JSON.stringify(dataRouter));
        api.redirectPage('/pages/login/index')
    }
}

/**
 * 发送请求
 * @param {Object} options
 * @param {String} options.url 请求地址
 * @param {String} options.method 请求方式
 * @param {String} options.data 入参
 * @param {String} options.loading 请求地址
 * @param {String} options.loadingText 请求地址
 * @param {String} options.whiteAuth 是否是白名单
 * @return {function} promise
 */
function beforeRequest(options) {
    return new Promise((resolve, reject) => {
        let token = APP_CONFING.TOKEN;
        let header = APP_CONFING.HEADER;
        // 判断是否需要登录权限(默认需要登录权限)
        if (!options.whiteAuth === true && !token) {
            loginRequest(resolve, reject, '请先登录');
            return
        }
        // 判断是否显示加载框
        if (options.loading) {
            wx.showLoading({
                title: options.loadingText || '加载中'
            });
        }
        if(token){
            header['token'] = token;
        }
        header['requestId'] = new Date().getTime();
        options.data = {
            userId: APP_CONFING.USER_INFO.userId,
            userImCode: APP_CONFING.TOKEN_TIM.IM_ID,
            patientId: APP_CONFING.TOKEN_TIM.IM_ID && APP_CONFING.TOKEN_TIM.IM_ID.replace(/[^0-9]/ig, ""),
            ...options.data
        };
        options.data = APP_CONFING.ENCRY ? cryptoJs.encrypt(JSON.stringify(options.data)) : options.data;
        options.header = header;
        afterRequest(options, resolve, reject)
    })
}

/**
 * 发送请求
 * @param {Object} options
 * @param {String} options.url 请求地址
 * @param {String} options.method 请求方式
 * @param {String} options.data 入参
 * @param {String} options.header 请求头部
 * @param {String} options.loading 请求地址
 * @param {String} options.loadingText 请求地址
 * @param {String} options.whiteAuth 是否是白名单
 * @param {String} resolve 成功
 * @param {String} reject 失败
 * @return {function} promise
 */
function afterRequest(options, resolve, reject) {
    wx.request({
        url: options.url,
        method: options.method,
        header: options.header,
        data: options.data,
        timeout: 30000,
        success: (res) => {
            let data = res.data;
            // if (APP_CONFING.ENCRY) {
            //     //解密并去除空格和换行符
            //     let x = cryptoJs.decrypt(data).replace(/[ ]|[\r\n]/g, "");
            //     //展现多余的u0000
            //     x = JSON.stringify(x).replace(/[\\]/g, '');
            //     //去除u0000
            //     x = x.replace(new RegExp('u0000', "gm"), '');
            //     //截取JSON字符串对象
            //     x = x.substring(1, x.length - 1);
            //     //转为JSON对象
            //     data = JSON.parse(x);
            //     api.log('回参', data)
            // }
            let {
                code,
                message
            } = data;
            // 正常状态码的响应处理
            if (code === "200") {
                resolve(data, res);
            }
            // 特殊错误状态码的响应处理
            else if (['401', '402'].indexOf(code) !== -1) {
                reject(data);
            }
            // 信息过期需要重新登录的特殊状态码响应处理
            else if (['410000', '410001', '410002', '40000'].indexOf(code) !== -1) {
                loginRequest(resolve, reject, data);
            } else {
                reject(message || '服务器错误');
            }
        },
        fail: (err) => {
            reject(err);
            api.log("加载失败", err)
        },
        complete: (message) => {
            if (options.loading) {
                wx.hideLoading();
            }
        }
    })
}

const request = {};

// 设置请求方式(BASE_URL)
['options', 'get', 'post', 'put', 'head', 'delete'].forEach((method) => {
    request[method] = (options = {}) => {
        options.url = `${APP_CONFING.BASE_URL}${options.url}`;
        return beforeRequest({method, ...options})
    }
});

module.exports = request;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序使用AES加密和解密 的相关文章

  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time
  • vue 点击改变数组中选中的icon颜色(结合拖拽实现)

    1 vue 点击改变数组中选中的icon颜色 在Vue中 可以通过使用v bind指令来动态地修改元素的样式 要根据点击事件来改变数组中选中图标的颜色 首先需要定义一个data属性来存储当前被选中的索引值或者其他相关信息 然后 在模板中使用
  • 1-创建小程序项目

    注册 打开https mp weixin qq com 点击 立即注册 选择小程序 获取APPID 登录小程序在 开发管理 gt 开发设置 获取 APPID 开发工具 登录小程序在 开发工具 gt 开发者工具 获取 微信开发者工具 创建小程
  • 【网络安全】web漏洞-xml外部实体注入(XXE)

    web漏洞 xml外部实体注入 XXE 目录 web漏洞 xml外部实体注入 XXE 概念 危害 检测方法 利用方法 漏洞利用 xxe lab 有回显情况 无回显情况 pikachu靶场
  • Typecho 最新XC主题 去除域名授权全解密源码

    简介 Typecho 最新XC主题 去除域名授权全解密源码 这是一款多样式主题 首页支持六种主题样式 支持Pjax优化访问速度 多种单页 如友链 说说等 评论支持表情 自定义编辑器 支持其他样式功能 该主题功能性挺高 比较花里胡哨 感觉有一
  • Element-Puls中el-upload组件结合vue-draggable-plus实现上传支持拖拽排序(并保留el-upload原有样式、预览、删除)等功能

    展示效果 需求 需求想要一个可拖拽排序的图片列表 但是发现el upload虽然可以实现照片墙 但是没办法拖拽 实现思路 使用 vue draggable plus 拖拽插件 隐藏Upload原有的已上传文件列表 自定义上传后文件列表的样式
  • JS特效第74弹:旅游城市图片百叶窗切换React特效

    全屏的旅游城市景点图片滑动百叶窗轮播切换效果 先来看看效果 一部分关键的代码如下 div div
  • 微信怎么申请小程序商城?一步步教你完成

    随着移动互联网的发展 越来越多的企业和个人开始关注微信小程序 微信小程序是一种不需要下载安装即可使用的应用 它实现了应用 触手可及 的梦想 用户扫一扫或者搜一下就能打开应用 其中 小程序商城因其便捷性和实用性 受到了众多商家的青睐 那么 如
  • 前端必备的 web 安全知识手记

    前言 安全这种东西就是不发生则已 一发生则惊人 作为前端 平时对这方面的知识没啥研究 最近了解了下 特此沉淀 文章内容包括以下几个典型的 web 安全知识点 XSS CSRF 点击劫持 SQL 注入和上传问题等 下文以小王代指攻击者 话不多
  • 每天10个前端小知识 <Day 7>

    前端面试基础知识题 1 什么是尾调用优化和尾递归 尾调用的概念非常简单 一句话就能说清楚 就是指某个函数的最后一步是调用另一个函数 function f x return g x 上面代码中 函数f的最后一步是调用函数g 这就叫尾调用 尾调
  • 「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

    1 什么是 CSRF 面试的时候的著名问题 谈一谈你对 CSRF 与 SSRF 区别的看法 这个问题 如果我们用非常通俗的语言讲的话 CSRF 更像是钓鱼的举动 是用户攻击用户的 而对于 SSRF 来说 是由服务器发出请求 用户 日 服务器
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 低代码配置-列表页组件设计

    保存 表单属性存放 bill 筛选项配置存放 filterLayout 列表按钮存放 buttonLayout 列表布局存放 listLayout api存放 api 数据结构 layout 存放表单基础配置 bill 存放按钮基础配置 b
  • 低代码配置-属性配置面板设计

    模块设计 tab项切换 组件基础属性 组件数据属性 组件事件属性 表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源 调用接口时一次赋予 无需使用selectItem 如需使用 归入基础属性 列表标题 是否展示筛选区域
  • 新手也能看懂的【前端自动化测试入门】!

    前言 最近在网上搜索前端自动化测试相关的文档 但是发现网上的文章都是偏使用 没有把一些基础概念说清楚 导致后续一口气遇到一些 karma Jasmine jest Mocha Chai BDD 等词汇的时候很容易一头雾水 这次一方面整理一下
  • APP开发毕业设计|ssm爱心小屋公益机构智慧管理APP

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef

随机推荐

  • element的嵌套dialog,在打开第二个dialog的时候会被遮罩层遮住

    element嵌套dialog遮罩层的问题 做项目的时候遇到一个问题 在一个弹出层的内容区做处理打开另一个弹出层时 第二个弹出层会被遮罩层遮住 点击五次之后遮罩层关闭 然后才发现 element 的dialog嵌套问题 之所以第二次弹出的会
  • 华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】,附详细解题思路

    一 题目描述 区块链底层存储是一个链式文件系统 由顺序的N个文件组成 每个文件的大小不一 依次为F1 F2 Fn 随着时间的推移 所占存储会越来越大 云平台考虑将区块链按文件转储到廉价的SATA盘 只有连续的区块链文件才能转储到SATA盘上
  • 安全基础 --- JSON + 函数声明

    JSON 格式 JSON JavaScript Object Notation缩写 是一种用于数据交换的文本格式 目的是取代繁琐笨重的 XML 格式 1 规定 复合类型的值只能是数组或对象 不能是函数 正则表达式对象 日期对象 原始类型的值
  • centos是arm还是amd_amd系列cpu安装linux

    如何在 Linux 上安装 Intel 微代码固件 linux 的内核可以在引导时更新 cpu 固件 而无需 bios 更新 处理器的微码保存在内存中 在每次启动系统时 内核可以更新这个微码 这些来自 intelamd 的微码的更新可以去修
  • unity多个贴图shader

    在一个Material上放多个贴图的测试 比如一个plane上放四个贴图 Shader aaa Properties MainTex Texture 2D white MainTex2 Texture 2D white MainTex3 T
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • http 11ajax.co,Internet Explorer 11 crashes when Angulars $http.post is used with large/complex json...

    I am consistently able to crash IE11 when I post large complex json object using Angulars http post method I have setup
  • (最详细!)汇编原理中OF(溢出)和CF(进位)的判断方法

    关于这个问题百度查了半天 都没有比较全面的解释 所以我来了 首先我们需要知道 al是用两位16进制的数来保存数据的 所以正数最多保存0 255 十进制 FFH 处理器内部以补码表示有符号数 8个二进制位能够表达的整数范围是 127 128
  • llama2模型部署方案的简单调研-GPU显存占用(2023年7月25日版)

    先说结论 全精度llama2 7B最低显存要求 28GB 全精度llama2 13B最低显存要求 52GB 全精度llama2 70B最低显存要求 280GB 16精度llama2 7B预测最低显存要求 14GB 16精度llama2 13
  • three.js 楼层加载动画

    three js 楼层加载动画 概述 创建场景 创建天空 创建水面 创建模型 开启模型动画 栅栏动画 概述 如有不明白的可以加QQ 2354528292 wx aichitudousien 更多教学视频请访问 https space bil
  • 跋20230325

    很久没有登录csdn 突然上号一次发现n多的评论和私信 时间跨度从2021年到2023年 感谢大家的信任 但是消息太多 且现在笔者已经没有从事相关行业 大家的问题很有深度 都是我答不上来的 这里就不一 一进行回复了 请大佬们见谅 博文都是笔
  • java字符串基础操作

    1 字符串的特点 java lang String使用了final修饰 不能被继承 字符串底层封装了字符数组及针对字符数组的操作算法 字符串一旦创建 对象内容永远无法改变 但字符串引用 可以重新赋值 Java字符串在内存中采用Unicode
  • 今天发现rabbitMQ消息堆积

    发现有三十多万的消息堆积在10的queue里没有被消费 记录一下查看问题的步骤 1 jps 找出程序的PID 2 jstack PID 查看线程dump 发现rabbitMQ的consumer worker线程block住了 Thread
  • 转眼就来字节六个月了,真的不一样

    今天来分享一个学弟 也是我老乡 阿秀 他入职字节跳动 6 个月的感受 希望给向往大厂的小伙伴一点点信心和动力 一 过去 首先来回复下有些小伙伴对字节存在的疑问 1 字节 996 的生活长期来看没有啥意义 我觉得还是挺有意义的 因为见识到了自
  • 前后端分离总结(部分)

    本文内容转载于博客 前后端分离架构概述 https blog csdn net fuzhongmin05 article details 81591072 1 背景 前后端分离已成为互联网项目开发的业界标准使用方式 通过nginx tomc
  • Springboot中使用netty 实现 WebSocket 服务

    依赖
  • C语言:写文件

    C语言 写文件 在C语言中 我们可以使用标准库函数来创建 打开 写入和关闭文件 文件操作是处理数据的重要方面之一 它允许我们将数据永久保存在磁盘上 并在需要时进行读取和修改 本文将介绍如何在C语言中写入文件 并提供相应的源代码示例 首先 我
  • [Dynamics CRM]错误代码参考

    转载于 http it zhaozhao info archives 20266 0x80048472 One or more imports are not in completed state Imported records can
  • 【Darknet】模型隐藏的一种方法

    之前在一个公司实习的时候有个需求 说要把Darknet的模型隐藏起来 就是说提供给用户的只有dll 而cfg和weights文件不能直接给客户 不然就暴露商业机密了嘛 所以就研究了一下如何隐藏模型 主要参考这篇文章 具体原理咱也不是很懂 反
  • 微信小程序使用AES加密和解密

    前端请求后端接口进行参数加密处理 const CryptoJs require crypto js const defaultKey zoe nurse qazxr8 默认的key const defaultIv qwertyuiopasd