/** * @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转换为Buffer(UTF-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转换为Buffer(UTF-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); }