更新记录
1.0.0(2026-07-19)
新增
- 请求数据加密(配置公钥自动加密 POST 请求的
data)
- 响应数据解密(配置私钥自动解密响应
data 字段)
- 自定义加解密函数支持(可灵活替换为任意算法)
- 自动适配
apiFieldMap.data 配置(兼容自定义响应字段名)
- 加密或解密失败时自动降级(不影响正常请求)
平台兼容性
uni-app(3.8.0)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
uni-app x(3.8.0)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
√ |
√ |
√ |
√ |
mh-request-encrypt
基于 mh-request 的加解密插件,支持请求加密和响应解密,开箱即用。
本插件是 mh-request 的配套插件,需配合使用。
特性
- 🔐 请求加密:若配置了公钥或自定义加密函数,则对
POST 请求的 data 进行加密
- 🔓 响应解密:若配置了私钥或自定义解密函数,则自动解密响应数据
- 🎛️ 自定义函数:支持自定义加解密逻辑,灵活适配业务需求
- 🔗 字段映射:自动适配
apiFieldMap 配置,支持自定义响应数据字段名
- 🔌 即插即用:作为
mh-request 插件,一行代码集成
- 📦 零依赖:内置
JSEncrypt,无额外包体积负担
快速开始
引入插件
import { Request } from '@/uni_modules/mh-request'
import { encryptPlugin } from '@/uni_modules/mh-request-encrypt'
const request = new Request({
baseURL: 'https://api.example.com',
successCode: 1,
plugins: [
{
plugin: encryptPlugin,
config: {
publicKey: 'MIIBIjANBg...', // 公钥(Base64,不含 PEM 头尾)
privateKey: 'MIIEvQIBAD...', // 私钥(Base64,不含 PEM 头尾)
// encryptFn: (plaintext) => '自定义加密结果',
// decryptFn: (ciphertext) => '自定义解密结果'
}
}
]
})
配置项
| 属性 |
类型 |
必填 |
默认值 |
说明 |
| publicKey |
string |
❌ |
- |
公钥(单行 Base64 字符串,不含 PEM 头尾),用于加密请求数据 |
| privateKey |
string |
❌ |
- |
私钥(单行 Base64 字符串,不含 PEM 头尾),用于解密响应数据 |
| encryptFn |
(plaintext: string) => string |
❌ |
- |
自定义加密函数,优先级高于默认 JSEncrypt 加密 |
| decryptFn |
(ciphertext: string) => string |
❌ |
- |
自定义解密函数,优先级高于默认 JSEncrypt 解密 |
至少需要配置 publicKey / privateKey / encryptFn / decryptFn 中的任意一个,否则插件不生效。
工作原理
请求加密流程
原始数据 → JSON 序列化 → 加密 → { data: 密文 }
- 请求拦截器自动将 POST 请求的 data 对象序列化为 JSON 字符串
- 使用公钥或自定义加密函数加密得到密文
- 替换请求数据为
{ data: 密文 } 结构
响应解密流程
响应数据 → 解密 → JSON 反序列化 → 原始数据
- 响应拦截器检测到响应数据包含加密的 data 字段(支持
apiFieldMap 映射)
- 使用私钥或自定义解密函数解密得到明文
- 自动解析为 JSON 对象
使用示例
基础用法(公钥加密 + 私钥解密)
import { Request } from '@/uni_modules/mh-request'
import { encryptPlugin } from '@/uni_modules/mh-request-encrypt'
const request = new Request({
baseURL: 'https://api.example.com',
plugins: [
{
plugin: encryptPlugin,
config: {
publicKey: 'MIIBIjANBg...',
privateKey: 'MIIEvQIBAD...'
}
}
]
})
// POST 请求时,数据会自动加密
const res = await request.post('/user/login', {
username: 'admin',
password: '123456'
})
// 实际发送: { data: '加密后的密文' }
// 响应解密后: { username: 'admin', password: '123456' }
仅加密(只配置公钥)
const request = new Request({
baseURL: 'https://api.example.com',
plugins: [
{
plugin: encryptPlugin,
config: {
publicKey: 'MIIBIjANBg...' // 只配公钥,只加密不解密
}
}
]
})
仅解密(只配置私钥)
const request = new Request({
baseURL: 'https://api.example.com',
plugins: [
{
plugin: encryptPlugin,
config: {
privateKey: 'MIIEvQIBAD...' // 只配私钥,只解密不加密
}
}
]
})
自定义加解密函数
const request = new Request({
baseURL: 'https://api.example.com',
plugins: [
{
plugin: encryptPlugin,
config: {
publicKey: 'MIIBIjANBg...',
privateKey: 'MIIEvQIBAD...',
// 使用国密 SM2 或其他加密算法
encryptFn: (plaintext) => {
return sm2Encrypt(plaintext, publicKey)
},
decryptFn: (ciphertext) => {
return sm2Decrypt(ciphertext, privateKey)
}
}
}
]
})
配合 apiFieldMap 使用
const request = new Request({
baseURL: 'https://api.example.com',
apiFieldMap: {
code: 'status',
msg: 'message',
data: 'result' // 自定义响应数据的字段名
},
plugins: [
{
plugin: encryptPlugin,
config: {
publicKey: 'MIIBIjANBg...',
privateKey: 'MIIEvQIBAD...'
}
}
]
})
// 响应数据格式: { status: 1, message: 'success', result: '加密的密文' }
// 解密后: { status: 1, message: 'success', result: { username: 'admin', ... } }
注意事项
- 公钥和私钥使用裸 Base64 格式(不含
-----BEGIN PUBLIC KEY----- 等头尾),插件内部自动补全 PEM 格式
- 仅对 POST 请求的 JSON 类型 data 进行加密,其他请求方法保持原样
- 加密失败时自动降级,保持原始数据不变
- 解密失败时自动降级,保持原始响应数据不变