wsign
Version:
generate wechat / wework pay signture
142 lines (141 loc) • 4.33 kB
JavaScript
;
/*
* @Author: Yoney Y (YuTianyuan)
* @Date: 2022-02-19 18:52:12
* @Last Modified by: YoneyY (YuTianyuan)
* @Last Modified time: 2022-02-21 23:51:23
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs_1 = __importDefault(require("fs"));
const strdm_1 = __importDefault(require("strdm"));
const https_1 = __importDefault(require("https"));
const crypto_1 = __importDefault(require("crypto"));
/**
* 兼容微信/企业微信支付参数加密使用
* Compatible with WeChat / WeWork payment parameter encryption
*/
class WxSign {
state;
/**
* 兼容微信/企业微信支付参数加密使用
* Compatible with WeChat / WeWork payment parameter encryption
* @param state
*/
constructor(state) {
if (state.params)
throw new Error('`params` field must be passed in through the `setParams` function');
this.state = state;
}
/**
* generate random string
* If you just want to generate random strings, you can install strdm library
* 如果只想生成随机字符串,可以安装 strdm 库
* @link see strdm library https://www.npmjs.com/package/strdm
* @param length
* @param options
* @returns
*/
generateString(length, options) {
return (0, strdm_1.default)(length, options);
}
/**
* generate only order
* @param num
* @returns
*/
generateOrder(num) {
if (num < 6)
throw new Error('The length of num cannot be less than 6');
const d = new Date();
const dl = [
d.getFullYear(),
d.getMonth() + 1,
d.getDate(),
d.getHours(),
d.getMinutes(),
d.getSeconds()
];
const dt = dl.map(item => `${item}`?.[1] ? item : '0' + item).join('');
const order = dt + (0, strdm_1.default)(num - dt.length, { strings: false });
return order;
}
/**
* generate sign
* @param type
* @returns
*/
generateSign(type = 'workwx_sign') {
const { params = {} } = this.state;
const stringSignTemp = Reflect
.ownKeys(params)
.sort()
.map((item) => (`${item}=${params[item]}`)).join('&');
const result = crypto_1.default
.createHash('md5')
.update(type === 'sign'
? stringSignTemp
+ '&key='
+ this.state.key
: stringSignTemp
+ '&secret='
+ this.state.secret, 'utf8')
.digest('hex')
.toUpperCase();
return result;
}
/**
* generate sign XML
* @param field
* @returns
*/
generateSignXML(field) {
const { params = {} } = this.state;
params[field] = this.generateSign('sign');
const xmlStr = `<xml>${Reflect.ownKeys(params).map((item) => `<${item}>${params[item]}</${item}>`).join('')}</xml>`;
return xmlStr;
}
/**
* generate agent
* @returns
*/
generateAgent() {
if (!this.state.agent)
throw new Error('Please pass in `agent` when instantiating');
const { key, cert } = this.state.agent;
return new https_1.default.Agent({
key: fs_1.default.existsSync(key) ? fs_1.default.readFileSync(key) : key,
cert: fs_1.default.existsSync(cert) ? fs_1.default.readFileSync(cert) : cert
});
}
/**
* setData
* @param key
* @param value
* @returns
*/
setData(key, value) {
if (key == null)
throw new Error('`key` param must be required');
if (value == null)
throw new Error('`value` param must be required');
if (typeof key !== 'string')
throw new Error('`key` param must be string type');
if (!this.state.params)
this.state.params = {};
this.state.params[key] = value;
return this;
}
/**
* setParams
* @param params
* @returns
*/
setParams(params = {}) {
this.state.params = params;
return this;
}
}
exports.default = WxSign;