yp-wx-payment
Version:
微信支付 for nodejs
86 lines (75 loc) • 3.28 kB
JavaScript
;
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 || {}));
})
};