UNPKG

yp-wx-payment

Version:
86 lines (75 loc) 3.28 kB
'use strict'; var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto); var _xml2js = require('xml2js'); var _xml2js2 = _interopRequireDefault(_xml2js); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = { // 解密证书 decryptCertificates: (keys, cert) => { // 向量 const iv = cert.encrypt_certificate.nonce; let cdata = cert.encrypt_certificate.ciphertext; cdata = Buffer.from(cdata, 'base64').toString('binary'); const decipher = _crypto2.default.createDecipheriv('aes-256-gcm', Buffer.from(keys, 'binary'), Buffer.from(iv, 'binary')); decipher.setAutoPadding(true); decipher.setAAD(Buffer.from(cert.encrypt_certificate.associated_data, 'binary')); const data = Buffer.from(cdata, 'binary'); let rtn = decipher.update(data, 'binary', 'utf8').toString('utf8'); rtn = `${rtn.split('-----END CERTIFICATE-----')[0]}-----END CERTIFICATE-----`; cert.certificate = rtn; return cert; }, /** * RSA公钥加密 */ encryptRSAPublicKey: (txt, publicKey, OAEP = false) => { const buffer = Buffer.from(txt, 'utf8'); // if (typeof (publicKey) === 'string') { // publicKey = Buffer.from(publicKey, 'utf8'); // } const padding = OAEP ? _crypto2.default.constants.RSA_PKCS1_OAEP_PADDING : _crypto2.default.constants.RSA_PKCS1_PADDING; const encrypted = _crypto2.default.publicEncrypt({ key: publicKey, padding }, buffer); return encrypted.toString('base64'); }, decrypt: (encryptedData, key, iv = '') => { const decipher = _crypto2.default.createDecipheriv('aes-256-ecb', key, iv); decipher.setAutoPadding(true); let decoded = decipher.update(encryptedData, 'base64', 'utf8'); decoded += decipher.final('utf8'); return decoded; }, md5: (str, encoding = 'utf8') => _crypto2.default.createHash('md5').update(str, encoding).digest('hex'), hmac: (str, key) => _crypto2.default.createHmac('sha256', key).update(str).digest('hex'), checkXML: str => { const reg = /^(<\?xml.*\?>)?(\r?\n)*<xml>(.|\r?\n)*<\/xml>$/i; return reg.test(str.trim()); }, getFullDate: () => { const str = new Date(); const YYYY = str.getFullYear(); const MM = `00${str.getMonth() + 1}`.substr(-2); const DD = `00${str.getDate()}`.substr(-2); return YYYY + MM + DD; }, toQueryString: obj => Object.keys(obj).filter(key => key !== 'sign' && obj[key] !== undefined && obj[key] !== '').sort().map(key => `${key}=${obj[key]}`).join('&'), generate: (length = 16) => { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; let noceStr = ''; for (let i = 0; i < length; i += 1) { noceStr += chars.charAt(Math.floor(Math.random() * chars.length)); } return noceStr; }, buildXML: (obj, rootName = 'xml') => { const opt = { rootName, allowSurrogateChars: true, cdata: true }; return new _xml2js2.default.Builder(opt).buildObject(obj); }, parseXML: xml => new Promise((resolve, reject) => { const opt = { trim: true, explicitArray: false, explicitRoot: false }; _xml2js2.default.parseString(xml, opt, (err, res) => err ? reject(new Error('XMLDataError')) : resolve(res || {})); }) };