119 lines
3.6 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
/**
* @author huxuejian
* @date 2025-12-02
* @description 邮政快递相关业务代码
*/
const crypto = require('crypto');
const dayjs = require('dayjs');
const request = require('../../request');
const domain = process.env.CONFIG_EMS_API_DOMAIN;
const orgId = process.env.CONFIG_EMS_ORGID;
const aesKey = process.env.CONFIG_EMS_AES_Key;
const aesIv = process.env.CONFIG_EMS_AES_IV;
/**
* AES加密
* @param {string|object} decryptedData - 待加密的数据字符串或对象对象会被转为JSON字符串
* @param {string} encryptKey - 加密密钥
* @param {string} ivKeys - IV向量
* @returns {string} Base64编码的加密结果
*/
function aesEncrypt(decryptedData, encryptKey, ivKeys) {
// 如果输入是对象转换为JSON字符串
const data = typeof decryptedData === 'string' ? decryptedData : JSON.stringify(decryptedData);
// 将密钥和IV转换为BufferUTF-8编码
const key = Buffer.from(encryptKey, 'utf-8');
const iv = Buffer.from(ivKeys, 'utf-8');
// 创建加密器AES-128-CBC模式PKCS5Padding对应Node.js的默认padding
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
// 加密数据
let encrypted = cipher.update(data, 'utf-8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
/**
* AES解密
* @param {string} encryptedData - Base64编码的加密数据
* @param {string} encryptKey - 解密密钥
* @param {string} ivKeys - IV向量
* @returns {string} 解密后的UTF-8字符串
*/
function aesDecrypt(encryptedData, encryptKey, ivKeys) {
// 将密钥和IV转换为BufferUTF-8编码
const key = Buffer.from(encryptKey, 'utf-8');
const iv = Buffer.from(ivKeys, 'utf-8');
// 创建解密器AES-128-CBC模式
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
// 解密数据先Base64解码然后解密
let decrypted = decipher.update(encryptedData, 'base64', 'utf-8');
decrypted += decipher.final('utf-8');
return decrypted;
}
/**
* MD5摘要算法
* @param {string} key - 待计算MD5的字符串
* @returns {string} MD5哈希值小写十六进制
*/
function MD5(key) {
return crypto.createHash('md5').update(key, 'utf-8').digest('hex');
}
exports.createEMSOrder = async function (data) {
try {
const params = {
orgId,
requestTime: dayjs().format('YYYYMMDDHHmmss'),
requestData: aesEncrypt(data, aesKey, aesIv),
tranCode: 'S100001',
}
params.sysSign = MD5(`${params.tranCode}${params.requestTime}${aesKey}`);
const url = `${domain}/lifepayment-easypackage/order/datasync`;
const res = await request.main(url, params, 'POST');
if (res && res.responseCode === '0000') {
const data = aesDecrypt(res.responseData, aesKey, aesIv);
console.log('解密数据: ', data)
console.log(typeof data)
return { success: true, data }
}
return { success: true, message: res && res.responseMsg ? res.responseMsg : 'EMS下单失败' }
} catch (e) {
return { success: false, message: e.message }
}
}
exports.emsTest = async function () {
const data = {
uleShareUserId: 'yzg10000050008',
merchatOrderNo: Date.now(),
paymentAmount: 0.01,
orderCreateTime: dayjs().format('YYYYMMDDHHmmss'),
paymentTime: dayjs().format('YYYYMMDDHHmmss'),
logisticsOrder: '浙江省绍兴市越城区延安东路558号',
customerName: "胡学俭",
customerMobile: "17855833126",
items: [
{
itemId: "0001",
itemName: "测试药品",
itemPrice: 0.01,
buyNum: 1
}
]
}
return await exports.createEMSOrder(data);
}