1. 程式人生 > >nodejs呼叫微信支付API介面的通用函式

nodejs呼叫微信支付API介面的通用函式

這是一個nodejs呼叫微信支付API介面的通過函式,支援MD5和hmac-sha256兩種簽名方式。

var md5 = require('md5');
var hmac_sha256 = require("crypto-js/hmac-sha256"); //請自行 npm install crypto-js


var wxPost = function(postObject, parm, fn){
	//postObject為要提交的微信支付伺服器的引數列表,為json格式
	//parm為額外引數列表,包括path(微信支付API子地址,如:/pay/micropay)和sign_typ(引數加密型別,可選“MD5”或“HMAC-SHA256”)
	//fn為呼叫結束時的回撥(無論成功與否都回調,返回的引數是xml格式的)
	var mch_id = "微信支付服務商商戶號或普通商戶商戶號";
	var wkey = "微信支付API金鑰或APIv3金鑰";
	var keys = Object.keys(postObject).sort();
	var signData = '';
	for(var key of keys){
		if(postObject[key]){
			signData += "&" + key + "=" + postObject[key];
		}
	}
	signData = signData.slice(1) + "&key=" + wkey;
	var sign_type = parm.sign_type || "MD5";
	if(sign_type == "HMAC-SHA256"){
		var sign = hmac_sha256(signData, wkey) + ''; 
		sign = sign.toUpperCase();
	}else{
		var sign = md5(signData).toUpperCase();
	}	
	postObject.sign = sign;
	var postData = '<xml>';
	for(var key in postObject){
		if(postObject[key]){
			postData += '<' + key + '>' + postObject[key] + '</' + key + '>';
		}
	}
	postData += '</xml>';
	var opts = {
		method:'POST',
		hostname:'api.mch.weixin.qq.com',
		port:'443',
		pfx:fs.readFileSync('./cert/' + mch_id + '.pfx'), //對應API證書中的.p12檔案,改字尾名即可
		passphrase:mch_id,
		path:parm.path,
		headers:{
			'Content-Type':'application/x-www-form-urlencoded',
			'Content-Length':postData.length
		}
	}
	
	var body = '';
	var rq = https.request(opts,function(rs){
		rs.on('data',function(data){
			body += data;
		})
		rs.on('end', function(){
			if(fn){fn(body)}
		})
	});
	rq.write(postData);
	rq.on('error',function(err){
		if(fn){fn("<return_msg>" + err.message + "</return_msg>")}
	});	
	rq.end();		
}