119 lines
3.6 KiB
JavaScript
119 lines
3.6 KiB
JavaScript
|
|
/**
|
|||
|
|
* @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);
|
|||
|
|
}
|
|||
|
|
|