2024-10-14 00:16:08 +08:00
|
|
|
|
const express = require('express');
|
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
const axios = require('axios');
|
|
|
|
|
const bodyParser = require('body-parser');
|
|
|
|
|
const path = require('path');
|
|
|
|
|
|
|
|
|
|
const app = express();
|
|
|
|
|
const port = 3000;
|
|
|
|
|
|
|
|
|
|
// AES CBC 加密函数,返回 Base64
|
|
|
|
|
function aesEncrypt(plainText, key) {
|
|
|
|
|
const keyBuffer = Buffer.from(key, 'hex'); // 将16进制的密钥转换为 Buffer
|
|
|
|
|
const blockSize = 16; // AES 块大小
|
|
|
|
|
const iv = crypto.randomBytes(blockSize); // 生成随机 IV
|
|
|
|
|
const cipher = crypto.createCipheriv('aes-128-cbc', keyBuffer, iv);
|
|
|
|
|
cipher.setAutoPadding(true);
|
|
|
|
|
let encrypted = cipher.update(plainText);
|
|
|
|
|
encrypted = Buffer.concat([iv, encrypted, cipher.final()]);
|
|
|
|
|
return encrypted.toString('base64');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AES CBC 解密函数,返回解密后的明文
|
|
|
|
|
function aesDecrypt(encryptedText, key) {
|
|
|
|
|
const encryptedBuffer = Buffer.from(encryptedText, 'base64');
|
|
|
|
|
const keyBuffer = Buffer.from(key, 'hex');
|
|
|
|
|
const blockSize = 16;
|
|
|
|
|
const iv = encryptedBuffer.slice(0, blockSize);
|
|
|
|
|
const encryptedData = encryptedBuffer.slice(blockSize);
|
|
|
|
|
const decipher = crypto.createDecipheriv('aes-128-cbc', keyBuffer, iv);
|
|
|
|
|
decipher.setAutoPadding(true);
|
|
|
|
|
let decrypted = decipher.update(encryptedData);
|
|
|
|
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
|
|
|
return decrypted.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模拟请求参数
|
|
|
|
|
const mockData = {
|
|
|
|
|
"FLXG3D56": {
|
|
|
|
|
mobile_no: "18276151590",
|
|
|
|
|
id_card: "45212220000827423X",
|
|
|
|
|
name: "张荣宏",
|
|
|
|
|
time_range: "5",
|
|
|
|
|
description: "特殊名单验证"
|
|
|
|
|
},
|
|
|
|
|
"FLXG54F5": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
description: "易诉人群识别"
|
|
|
|
|
},
|
|
|
|
|
"FLXG162A": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "团伙欺诈排查(通用版)"
|
|
|
|
|
},
|
|
|
|
|
"FLXG970F": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "李四",
|
|
|
|
|
description: "风险人员核验"
|
|
|
|
|
},
|
|
|
|
|
"FLXG5876": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
description: "易诉人"
|
|
|
|
|
},
|
|
|
|
|
"FLXG9687": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "王五",
|
|
|
|
|
description: "电诈风险预警-标准版"
|
|
|
|
|
},
|
|
|
|
|
"FLXGC9D1": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "赵六",
|
|
|
|
|
description: "黑灰产等级"
|
|
|
|
|
},
|
|
|
|
|
"FLXGCA3D": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "李四",
|
|
|
|
|
description: "个人综合涉诉"
|
|
|
|
|
},
|
|
|
|
|
"FLXGDEC7": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "个人不良"
|
|
|
|
|
},
|
|
|
|
|
"IVYZ385E": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "自然人生存状态标识"
|
|
|
|
|
},
|
|
|
|
|
"IVYZ5733": {
|
|
|
|
|
name: "李四",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
description: "单人婚姻登记信息核验"
|
|
|
|
|
},
|
|
|
|
|
"IVYZ9363": {
|
|
|
|
|
man_name: "张三",
|
|
|
|
|
man_id_card: "110101199003076534",
|
|
|
|
|
woman_name: "王五",
|
|
|
|
|
woman_id_card: "110101199003076535",
|
|
|
|
|
description: "双人婚姻状态识别"
|
|
|
|
|
},
|
|
|
|
|
"JRZQ0A03": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "借贷意向验证"
|
|
|
|
|
},
|
|
|
|
|
"JRZQ4AA8": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "王五",
|
|
|
|
|
description: "偿债压力指数"
|
|
|
|
|
},
|
|
|
|
|
"JRZQ8203": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "赵六",
|
|
|
|
|
description: "借贷行为验证"
|
|
|
|
|
},
|
|
|
|
|
"JRZQDCBE": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
bank_card: "6212261901001234567",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "银行卡四要素验证"
|
|
|
|
|
},
|
|
|
|
|
"QYGL2ACD": {
|
|
|
|
|
ent_name: "某企业",
|
|
|
|
|
legal_person: "李四",
|
|
|
|
|
ent_code: "91310000123456789X",
|
|
|
|
|
description: "企业三要素核验"
|
|
|
|
|
},
|
|
|
|
|
"QYGL6F2D": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
description: "人企关联"
|
|
|
|
|
},
|
|
|
|
|
"QYGL45BD": {
|
|
|
|
|
ent_name: "某公司",
|
|
|
|
|
legal_person: "王五",
|
|
|
|
|
ent_code: "91310000123456789X",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
description: "企业法人四要素核验"
|
|
|
|
|
},
|
|
|
|
|
"QYGL8261": {
|
|
|
|
|
ent_name: "某公司",
|
|
|
|
|
description: "企业综合涉诉"
|
|
|
|
|
},
|
|
|
|
|
"QYGLB4C0": {
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
description: "股东人企关系精准版"
|
|
|
|
|
},
|
|
|
|
|
"YYSY4B37": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
description: "手机在网时长"
|
|
|
|
|
},
|
2024-10-15 21:10:08 +08:00
|
|
|
|
"YYSY4B21": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
description: "手机在网状态"
|
|
|
|
|
},
|
2024-10-14 00:16:08 +08:00
|
|
|
|
"YYSY6F2E": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
mobile_type: "CMCC",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "运营商三要素核验(详版)"
|
|
|
|
|
},
|
|
|
|
|
"YYSY09CD": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
mobile_type: "CUCC",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
name: "李四",
|
|
|
|
|
description: "运营商三要素验证(简版)"
|
|
|
|
|
},
|
|
|
|
|
"YYSYBE08": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
name: "张三",
|
|
|
|
|
description: "运营商二要素核验(手机号、姓名)"
|
|
|
|
|
},
|
|
|
|
|
"YYSYD50F": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
id_card: "110101199003076534",
|
|
|
|
|
description: "运营商二要素核验(手机号、身份证)"
|
|
|
|
|
},
|
|
|
|
|
"YYSYF7DB": {
|
|
|
|
|
mobile_no: "13812345678",
|
|
|
|
|
start_date: "20220101",
|
|
|
|
|
description: "手机二次卡"
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
// 使用 EJS 模板引擎
|
|
|
|
|
app.set('view engine', 'ejs');
|
|
|
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
|
|
|
|
|
|
// 解析POST请求的数据
|
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
|
app.use(bodyParser.urlencoded({ extended: true }));
|
|
|
|
|
|
|
|
|
|
// 提供静态文件(比如 CSS)
|
|
|
|
|
app.use(express.static(path.join(__dirname, 'public')));
|
|
|
|
|
|
|
|
|
|
// 提供前端页面
|
|
|
|
|
app.get('/', (req, res) => {
|
|
|
|
|
res.render('index', { interfaces: Object.keys(mockData), mockData: mockData });
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 处理 API 请求
|
|
|
|
|
app.post('/request-api', async (req, res) => {
|
|
|
|
|
const { interfaceName, params } = req.body;
|
|
|
|
|
|
|
|
|
|
const url = `http://api.tianyuanapi.com/api/v1/${interfaceName}`;
|
2024-10-15 21:10:08 +08:00
|
|
|
|
// const url = `http://127.0.0.1:10003/api/v1/${interfaceName}`;
|
|
|
|
|
|
2024-10-14 00:16:08 +08:00
|
|
|
|
const accessId = 'aa16cc6e9da90461';
|
|
|
|
|
const key = 'ff83609b2b24fc73196aac3d3dfb874f'; // AES 16进制密钥
|
|
|
|
|
|
|
|
|
|
const data = JSON.parse(params); // 使用用户自定义的参数
|
|
|
|
|
const jsonStr = JSON.stringify(data);
|
|
|
|
|
const encryptedData = aesEncrypt(jsonStr, key);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const response = await axios.post(url, { data: encryptedData }, {
|
|
|
|
|
headers: {
|
|
|
|
|
'Access-Id': accessId,
|
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
|
}
|
|
|
|
|
});
|
2024-10-15 21:10:08 +08:00
|
|
|
|
console.log("response.data", response.data)
|
|
|
|
|
|
2024-10-14 00:16:08 +08:00
|
|
|
|
|
2024-10-15 21:10:08 +08:00
|
|
|
|
const { code, message, data: encryptedResponseData } = response.data;
|
|
|
|
|
|
|
|
|
|
let decryptedData = null;
|
|
|
|
|
|
|
|
|
|
// 如果有返回data,无论code是否为0,都尝试解密
|
|
|
|
|
if (encryptedResponseData) {
|
|
|
|
|
try {
|
|
|
|
|
decryptedData = aesDecrypt(encryptedResponseData, key);
|
|
|
|
|
decryptedData = JSON.parse(decryptedData); // 解密后的数据解析为对象
|
|
|
|
|
} catch (decryptError) {
|
|
|
|
|
// 解密失败时返回null
|
|
|
|
|
decryptedData = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-10-14 00:16:08 +08:00
|
|
|
|
|
2024-10-15 21:10:08 +08:00
|
|
|
|
// 返回响应,无论code是否为0,统一返回加密和解密数据
|
2024-10-14 00:16:08 +08:00
|
|
|
|
res.json({
|
2024-10-15 21:10:08 +08:00
|
|
|
|
code,
|
|
|
|
|
success: code === 0,
|
|
|
|
|
message,
|
|
|
|
|
encryptedResponse: encryptedResponseData || null,
|
|
|
|
|
decryptedResponse: decryptedData
|
2024-10-14 00:16:08 +08:00
|
|
|
|
});
|
|
|
|
|
} catch (error) {
|
|
|
|
|
res.json({ success: false, message: '请求失败', error: error.message });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
app.listen(port, () => {
|
|
|
|
|
console.log(`Server running at http://localhost:${port}`);
|
|
|
|
|
});
|