UNPKG

node-easywechat

Version:

EasyWechat SDK for Node.js (NOT OFFICIAL)

143 lines (142 loc) 5.07 kB
'use strict'; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const RSA_1 = __importDefault(require("../Core/Support/RSA")); const Utils_1 = require("../Core/Support/Utils"); class Utils { constructor(merchant) { this.merchant = merchant; } /** * 创建签名(V3),并返回签名字符串 * @param params 参数集合 * @returns */ createSignature(message) { let rsa = new RSA_1.default; rsa.setPublicKey(this.merchant.getCertificate().toString()); rsa.setPrivateKey(this.merchant.getPrivateKey().toString()); return rsa.sign(message); } /** * 创建签名(V2),并返回签名字符串 * @param params 参数集合 * @returns */ createV2Signature(params) { let signString = ''; let sparator = ''; let keys = Object.keys(params); keys = keys.sort(); for (let i = 0; i < keys.length; i++) { if (keys[i] == 'sign' || keys[i] == 'paySign' || typeof params[keys[i]] === undefined || params[keys[i]] === null) continue; signString += sparator + keys[i] + '=' + params[keys[i]]; sparator = '&'; } let key = this.merchant.getV2SecretKey(); if (!key) { throw new Error('Missing V2 API key.'); } signString += '&key=' + key; let sign = ''; let type = params['signType'] ? (params['signType'] + '').toLowerCase() : 'md5'; switch (type) { case 'sha1': case 'md5': sign = (0, Utils_1.createHash)(signString, type); break; case 'hmac-sha256': case 'hmac_sha256': type = type.replace(/^hmac[\-|_]/i, ''); sign = (0, Utils_1.createHmac)(signString, key, type); break; } if (!sign) { throw new Error('Failed to sign the request.'); } return (sign + '').toUpperCase(); } /** * 构建JSBridge支付参数 * @see [v3文档](https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_4.shtml) * @see [v2文档](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6) * @param prepayId 下单接口返回的prepay_id * @param appId 应用id * @param signType v3仅支持RSA,V2支持MD5、HMAC-SHA256 * @returns */ buildBridgeConfig(prepayId, appId, signType = 'RSA') { let params = { appId, timeStamp: (0, Utils_1.getTimestamp)(), nonceStr: (0, Utils_1.randomString)(), package: 'prepay_id=' + prepayId, signType, paySign: '', }; // v2 if (signType != 'RSA') { params.paySign = this.createV2Signature(params); } // v3 else { let message = `${params.appId}\n${params.timeStamp}\n${params.nonceStr}\n${params.package}\n`; params.paySign = this.createSignature(message); } return params; } /** * 构建JS-SDK支付参数 * @see https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#58 * @param prepayId 下单接口返回的prepay_id * @param appId 应用id * @param signType v3仅支持RSA,V2支持MD5、HMAC-SHA256 */ buildSdkConfig(prepayId, appId, signType = 'RSA') { let config = this.buildBridgeConfig(prepayId, appId, signType); return { appId: config.appId, timestamp: config.timeStamp, nonceStr: config.nonceStr, package: config.package, signType: config.signType, paySign: config.paySign, }; } /** * 构建小程序支付参数 * @see https://developers.weixin.qq.com/miniprogram/dev/api/payment/wx.requestPayment.html * @param prepayId 下单接口返回的prepay_id * @param appId 应用id * @param signType v3仅支持RSA,V2支持MD5、HMAC-SHA256 * @returns */ buildMiniAppConfig(prepayId, appId, signType = 'RSA') { return this.buildBridgeConfig(prepayId, appId, signType); } /** * 构建App支付参数 * @see https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_2_4.shtml * @param prepayId 下单接口返回的prepay_id * @param appId 应用id * @returns */ buildAppConfig(prepayId, appId) { let params = { appId, partnerid: this.merchant.getMerchantId(), prepayid: prepayId, nonceStr: (0, Utils_1.randomString)(), timestamp: (0, Utils_1.getTimestamp)(), package: 'Sign=WXPay', sign: '', }; let message = `${params.appId}\n${params.timestamp}\n${params.nonceStr}\n${params.prepayid}\n`; params.sign = this.createSignature(message); return params; } } ; module.exports = Utils;