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);
|
||
}
|
||
|