feat: 补齐客户端/管理端服务模块与数据库 schema,完善登录短信、法大大签署及公共函数

This commit is contained in:
2026-10-14 21:55:08 +08:00
parent 3481fda7a0
commit 55bcf96889
545 changed files with 28151 additions and 415 deletions
@@ -0,0 +1,171 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const CryptoJS = require("crypto-js");
const request = require("request");
var AuthorizationType;
(function (AuthorizationType) {
AuthorizationType[AuthorizationType["OPEN-FORM-PARAM"] = 0] = "OPEN-FORM-PARAM";
AuthorizationType[AuthorizationType["OPEN-BODY-SIG"] = 1] = "OPEN-BODY-SIG";
AuthorizationType[AuthorizationType["OPEN-ACCESS-TOKEN"] = 2] = "OPEN-ACCESS-TOKEN";
})(AuthorizationType || (AuthorizationType = {}));
/**
* Open SDK for Node.JS
*/
class OpenSdk {
/**
* @class
* @param {OpenSdkConfig} config 初始化 SDK 配置
*/
constructor(config) {
if (!config.appId) {
throw Error('config.appId is required');
}
if (!config.appKey) {
throw Error('config.appKey is required');
}
this.config = config;
}
/**
* 生成请求字符串
* @param {QueryParams} params 请求参数
* @return {string} 请求字符串
*/
generateSignature(params) {
if (!AuthorizationType[params.authorization]) {
params.authorization = AuthorizationType['OPEN-BODY-SIG'];
}
let content = JSON.stringify(params.content);
if (params.authorization === AuthorizationType['OPEN-FORM-PARAM']) {
let contentHash = CryptoJS.SHA256(content).toString();
let signStr = this.config.appId + params.timestamp + params.nonce + contentHash;
let signature = CryptoJS.HmacSHA256(signStr, this.config.appKey);
let signatureStr = CryptoJS.enc.Base64.stringify(signature);
let signatureEncode = encodeURIComponent(signatureStr);
let str = `?authorization=${params.authorization}&appId=${this.config.appId}&timestamp=${params.timestamp}&nonce=${params.nonce}&content=${content}&signature=${signatureEncode}`;
return str;
}
if (params.authorization === AuthorizationType['OPEN-BODY-SIG']) {
let contentHash = CryptoJS.SHA256(content).toString();
let signStr = this.config.appId + params.timestamp + params.nonce + contentHash;
let signature = CryptoJS.HmacSHA256(signStr, this.config.appKey);
let signatureStr = CryptoJS.enc.Base64.stringify(signature);
return signatureStr;
}
if (params.authorization === AuthorizationType['OPEN-ACCESS-TOKEN']) {
let signStr = this.config.appId + params.timestamp + params.nonce + this.config.appKey;
let signatureStr = CryptoJS.SHA256(signStr).toString();
return signatureStr;
}
}
/**
* 发送请求
* @param {QueryParams} params 请求参数
* @return {Promise<OpenSdkCommonResult | string>} 请求执行结果
*/
exec(params) {
return __awaiter(this, void 0, void 0, function* () {
if (!params.queryUrl) {
throw Error('params.queryUrl is required');
}
if (!params.nonce) {
throw Error('params.nonce is required');
}
if (!params.timestamp) {
throw Error('params.timestamp is required');
}
const str = this.generateSignature(params);
const config = this.config;
if (params.authorization === AuthorizationType['OPEN-FORM-PARAM']) {
const Url = params.queryUrl + encodeURIComponent(str);
return new Promise((resolve, reject) => {
request(Url, (error, _response, body) => {
if (!error) {
if (typeof (body) === 'object') {
resolve(JSON.parse(body));
}
else {
resolve(body);
}
}
reject(error);
});
});
}
if (params.authorization === AuthorizationType['OPEN-BODY-SIG']) {
const Url = params.queryUrl;
return new Promise((resolve, reject) => {
request({
url: Url,
method: "POST",
headers: {
"Authorization": `OPEN-BODY-SIG AppId="${config.appId}", Timestamp="${params.timestamp}", Nonce="${params.nonce}", Signature="${str}"`,
},
body: JSON.stringify(params.content),
}, (error, _response, body) => {
if (!error) {
if (typeof (body) === 'object') {
resolve(JSON.parse(body));
}
else {
resolve(body);
}
}
reject(error);
});
});
}
if (params.authorization === AuthorizationType['OPEN-ACCESS-TOKEN']) {
const Url = params.queryUrl;
const token = yield new Promise((resolve, reject) => {
request({
url: 'https://test-api-open.chinaums.com/v1/token/access',
method: "POST",
body: JSON.stringify({
appId: config.appId,
timestamp: params.timestamp,
nonce: params.nonce,
signMethod: 'SHA256',
Signature: str
})
}, (error, _response, body) => {
if (!error) {
resolve(JSON.parse(body).accessToken);
}
reject(error);
});
});
return new Promise((resolve, reject) => {
request({
url: Url,
method: "POST",
headers: {
"Authorization": `OPEN-ACCESS-TOKEN AccessToken="${token}"`,
},
body: JSON.stringify(params.content),
}, (error, _response, body) => {
if (!error) {
if (typeof (body) === 'object') {
resolve(JSON.parse(body));
}
else {
resolve(body);
}
}
reject(error);
});
});
}
});
}
}
exports.default = OpenSdk;
//# sourceMappingURL=base.js.map
@@ -2,6 +2,8 @@
* 自定义公共函数包
* 这里可以写你自己的公共函数
*/
var CryptoJS = require("crypto-js");
const crypto = require('crypto');
var pubFun = {};
/**
* 公共函数写法示例
@@ -10,17 +12,196 @@ var pubFun = {};
* 或
* vk.myfn.test();
*/
pubFun.test = function(path) {
// 此处可以直接使用 vk 实例
let timeStr = vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
// 逻辑
// ...
// 逻辑
return {
timeStr,
msg: "这是公共函数test的返回"
}
pubFun.test = function (path) {
// 此处可以直接使用 vk 实例
let timeStr = vk.pubfn.timeFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
// 逻辑
// ...
// 逻辑
return {
timeStr,
msg: "这是公共函数test的返回"
}
}
// const url = 'http://test.api.fabigbig.com:8888/api'
// const app_id = 405942
// const app_secret = 'ODDW0vm9FvDj2RYQRmoryVnH'
module.exports = pubFun;
const url = 'https://textapi.fadada.com/api2/'
const app_id = 502704
const app_secret = 'cd1nHX8WnyE1DOiRXfKGNlwu'
const getFadadaSign = function (api, params, timestamp) {
if (api === 'https://tczapi.fadada.com/czapi/api/compliance-contract-report' || api === 'https://czapi-test.fadada.com/evidence-api/api/compliance-contract-report') {
console.log('app_id', app_id)
console.log('timestamp', timestamp)
console.log('app_secret', app_secret)
console.log('contractNum', params.contractNum)
// let bParams = `${app_secret}${params.contractNum}${app_id}${params.evidenceType}`
let bParams = `${app_secret}${params.contractNum}`
const b = CryptoJS.SHA1(bParams).toString().toUpperCase()
const a = CryptoJS.SHA1(`${app_id}${CryptoJS.MD5(timestamp).toString().toUpperCase()}${b}`).toString().toUpperCase()
// if (params.reportExpressInfo) {
// bParams += `${params.reportExpressInfo.address}${params.reportExpressInfo.mobile}${params.reportExpressInfo.name}`
// }
// if (params['reportExpressInfo.name']) {
// bParams += `${params['reportExpressInfo.address']}${params['reportExpressInfo.mobile']}${params['reportExpressInfo.name']}`
// }
console.log('timestamp cryp', CryptoJS.MD5(timestamp).toString().toUpperCase())
console.log('a data', `${app_id}${CryptoJS.MD5(timestamp).toString().toUpperCase()}${b}`)
console.log('aParams', a)
console.log('bParams', bParams)
console.log('b', b)
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(a));
}
const copyParams = {
...params
}
//1. A.将参与摘要计算的业务参数按字典升序排列
let computeKeys = Object.keys(params)
var sortedParams = computeKeys.sort().reduce((acc, curr, index) => {
acc += params[curr];
return acc;
}, '');
// 1.B.将 app_secret 附加到字符串串前
let str1 = app_secret + sortedParams
console.log('sortedParams: ', sortedParams);
if (api === 'generate_contract.api') {
str1 = app_secret + params.template_id + params.contract_id
} else if (api === 'uploaddocs.api') {
str1 = app_secret + params.contract_id
} else if (api === 'extsign.api') {
str1 = app_secret + params.customer_id
} else if (api === 'uploadtemplate.api') {
str1 = app_secret + params.template_id
}
// 步骤 2.对得到的字符串进⾏SHA1 加密
const sha1_1 = CryptoJS.SHA1(str1).toString().toUpperCase()
console.log('sha1_1: ', sha1_1);
// 步骤 3.计算 timestamp的MD5值,并和app_id,步骤 2 中得到的字符串拼接得到新的字符串
let timestampMd5 = ''
if (api === 'extsign.api') {
timestampMd5 = CryptoJS.MD5(params.transaction_id + timestamp).toString().toUpperCase()
} else {
timestampMd5 = CryptoJS.MD5(timestamp).toString().toUpperCase()
}
let str2 = app_id + timestampMd5 + sha1_1
if (api == 'generate_contract.api') {
str2 += params.parameter_map
} else if (api == 'extsign.api') {
}
// 步骤 4.对步骤3中得到的字符串进行SHA1 加密
const str3 = CryptoJS.SHA1(str2).toString().toUpperCase()
// 步骤 5.对步骤 4 中得到的字符串进⾏base64 加密
var wordArray = CryptoJS.enc.Utf8.parse(str3);
const msg_digest = CryptoJS.enc.Base64.stringify(wordArray);
return msg_digest;
}
pubFun.getFadadaSign = getFadadaSign
/**
* 给法大大发请求
* @param {Object} api
* @param {Object} params
* @param {Object} fullUrl
* @param header
*/
pubFun.fadada = async function (api, params, fullUrl = false, header = {
"content-type": "application/x-www-form-urlencoded;charset=UTF-8",
}) {
const timestamp = vk.pubfn.timeFormat(new Date(), "yyyyMMddhhmmss");
// const timestamp = '20251021181001';
const msg_digest = getFadadaSign(api, params, timestamp)
console.log('msg_digest: ', msg_digest, timestamp);
const res = await vk.request({
url: !fullUrl ? (url + '/' + api) : api,
method: "POST",
header,
data: {
app_id: app_id,
appId: app_id,
timestamp,
v: '2.0',
msg_digest,
msgDigest: msg_digest,
...params
},
timeout: 60000
});
console.log('res: ', res);
return res;
}
function buildQueryString(params) {
let queryString = '';
for (const key in params) {
if (params.hasOwnProperty(key)) {
if (queryString.length > 0) {
queryString += '&';
}
queryString += `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`;
}
}
return queryString;
}
/**
* 给法大大发请求
* @param {Object} api
* @param {Object} params
*/
pubFun.fadadaUrl = function (api, params) {
const timestamp = vk.pubfn.timeFormat(new Date(), "yyyyMMddhhmmss");
const msg_digest = getFadadaSign(api, params, timestamp)
const queryParams = buildQueryString({
app_id: app_id,
timestamp,
v: '2.0',
msg_digest,
...params
});
const fullUrl = `${url}/${api}?${queryParams}`;
return fullUrl;
}
pubFun.base64ToFile = function (base64, fileName) {
}
pubFun.sendNotifySms = async function (userId, templateId, data = {}) {
const user = await vk.baseDao.findByWhereJson({
dbName: "uni-id-users",
whereJson: {
_id: userId
}
})
if (user) {
const smsRes = await vk.system.smsUtil.sendSms({
provider: "aliyun",
templateId,
phone: user.mobile,
data
})
console.log('smsSendPhone', user.mobile)
console.log('smsRes', smsRes)
}
}
module.exports = pubFun;