var https = require("https"); var jsrsasign = require('jsrsasign'); var urlencode = require('urlencode'); // 签名使用的私钥(瑞宏网提供) var privateKeyPem = "请向瑞宏网工作人员索取"; // 销售方纳税人识别号 var taxpayerCode = "请向瑞宏网工作人员索取"; /** * 生成签名 * @param privateKeyPem 签名使用的私钥(瑞宏网提供) * @param digestString 需要签名的字符串 */ var getSign = function(privateKeyPem, digestString) { var prvKey = jsrsasign.KEYUTIL.getKeyFromPlainPrivatePKCS8PEM("-----BEGIN PRIVATE KEY-----" + privateKeyPem); var sig = new jsrsasign.KJUR.crypto.Signature({"alg": "MD5withRSA"}); sig.init(prvKey); // 设置key var signHex = sig.signString(digestString); // 签名 return jsrsasign.hex2b64(signHex); // 得到签名Hex,并转成base64string }; // 请求数据 var requestData = { serialNo: "15244572079331206", postTime: "2017-11-01 09:42:00", order: { account: ".", address: ".", email: "test@chinaeinv.cn", tel: "18600000000", orderNo: "zbss000000002" }, invoice: { taxpayerCode: taxpayerCode, customerName: "abc", customerCode: "370212350288104", drawer: "abc", totalAmount: "0.01", customerAddress: "abc", customerTel: "12345678", customerBankName: "abc", customerBankAccount: "984484121854121", payee: "abc", reviewer: "abc", items: [ { amount: "0.01", code: "zbss00000000101", name: "abc", price: "0.01", quantity: "1", taxRate: "0.17", uom: "abc", type: "0", spec: "abc", catalogCode: "1020202000000000000" } ] }, notices: [ { type: "email", value: "hongpujun@chinaeinv.cn" }, { type: "sms", value: "18660243735" } ] }; // 请求数据的字符串格式 var requestString = JSON.stringify(requestData); // 签名字符串 var sign = getSign(privateKeyPem, requestString); // http请求参数 var options = { host: 'www.chinaeinv.com', // 瑞宏网域名 port: 943, // 瑞宏网端口(测试环境:943,生产环境:443) path: '/igs/api/invoiceApi.jspa?appCode=PTTEST13&cmdName=chinaeinv.api.invoice.v3.kp_async&sign=' + urlencode(urlencode(sign)), // 注意签名字段需要要两次urlencode,以避免加号变空格 method:'POST', headers:{ 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(requestString) } } // 发送 HTTPS POST 请求 var req = https.request(options, function(res) { console.log("请求报文: ", requestString); console.log("签名:", sign); console.log("statusCode: ", res.statusCode); var _data=''; res.on('data', function(chunk){ _data += chunk; }); res.on('end', function(){ console.log("响应报文:",_data) }); }); req.write(requestString); req.end;