feat: 补齐客户端/管理端服务模块与数据库 schema,完善登录短信、法大大签署及公共函数
This commit is contained in:
@@ -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}×tamp=${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;
|
||||
Reference in New Issue
Block a user