2026-07-27 11:28:33 +08:00

119 lines
3.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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);
}