微信提现 (nodejs),其实你也看得懂!!!

/***
 * 微信提现
 * by wangge
 * 1018.2.7
 */
var https = require('https');
var cryptoMO = require('crypto'); // MD5算法
var request = require("request");
var fs = require("fs");

//猪方法
exports.payOut = function(obj, cb) {
	var openid = obj.openid;
    //var spbillip = req.ip.replace('::ffff:', ''); // 获取客户端ip
	var spbillip = '192.1**.2.102' //有效ip即可
	var appid = obj.appId;
	var mchid = obj.mch_id;
	var mch_my = obj.mch_miyao;
	var body = obj.body; // 商品描述
	var notifyurl = 'https://www.***.com/wxpay'; // 成功的回调地址  可访问 不带参数
	var noncestr = getNonceStr(); // 随机字符串
	var outtrade_no = getWxPayOrdrID(); // 商户订单号
	var totalfee = obj.money; // 订单价格 单位是 分
	var timestamp = Math.round(new Date().getTime() / 1000); // 当前时间
	var checkname = obj.checkname; //校验用户名
	var re_user_name = obj.re_user_name //收款用户名

	console.log(mch_my + "这是密钥001")
	console.log(totalfee + "这厮是金额001")
	var sign = paysignjsapi(
		appid, //appid 
		body, //描述
		mchid, //商户id
		noncestr, //随机字符串
		openid, //用户openid
		checkname,  校验用户名
		re_user_name, // 校验收款用户名
		outtrade_no, //订单号
		spbillip, //请求端IP地址
		totalfee, //订单价格,分
		mch_my //商户密钥
	);
	console.log(sign + "这厮签名签名签名签名签名签名签名")

	var bodyData = '<xml>';
	bodyData += '<mch_appid>' + appid + '</mch_appid>';  /* 小程序ID*/
	bodyData += '<mchid>' + mchid + '</mchid>'; // 商户号
	bodyData += '<nonce_str>' + noncestr + '</nonce_str>'; // 随机字符串
	bodyData += '<partner_trade_no>' + outtrade_no + '</partner_trade_no>'; // 商户订单号
	bodyData += '<openid>' + openid + '</openid>'; // 用户标识
	bodyData += '<check_name>' + checkname + '</check_name>'; // 校验用户
	bodyData += '<re_user_name>' + re_user_name + '</re_user_name>'; // 校验用户名
	bodyData += '<amount>' + totalfee + '</amount>'; // 总金额 单位为分
	bodyData += '<desc>' + body + '</desc>'; // 商品描述
	bodyData += '<spbill_create_ip>' + spbillip + '</spbill_create_ip>'; // 终端IP
	bodyData += '<sign>' + sign + '</sign>'; //签名
	bodyData += '</xml>';
	
	var urlStr = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"
	console.log(bodyData + "传入的参数")

	request({
		url: urlStr,
		method: 'POST',
		body: bodyData,
		agentOptions: { //  
			cert: fs.readFileSync(obj.certpem,'utf8'),
			key: fs.readFileSync(obj.keypem,'utf8'),
 			  // cert: fs.readFileSync("./config/apiclient_cert.pem"),
			  // key: fs.readFileSync("./config/apiclient_key.pem"),
			passphrase: mchid
		}
	}, function(error, response, body) {
		if(!error && response.statusCode == 200) {
			var obj = {};
			obj.body = body;
			obj.timestamp = timestamp;
			obj.noncestr = noncestr;
			cb(obj);
		} else {
			cb("err");
		}
	})
}

/*生成商户订单号(由当前时间组成的一串数字)*/
function getWxPayOrdrID() {
	var myDate = new Date();
	var year = myDate.getFullYear();
	var mouth = myDate.getMonth() + 1;
	var day = myDate.getDate();
	var hour = myDate.getHours();
	var minute = myDate.getMinutes();
	var second = myDate.getSeconds();
	var msecond = myDate.getMilliseconds(); //获取当前毫秒数(0-999)
	if(mouth < 10) { /*月份小于10  就在前面加个0*/
		mouth = String(String(0) + String(mouth));
	}
	if(day < 10) { /*日期小于10  就在前面加个0*/
		day = String(String(0) + String(day));
	}
	if(hour < 10) { /*时小于10  就在前面加个0*/
		hour = String(String(0) + String(hour));
	}
	if(minute < 10) { /*分小于10  就在前面加个0*/
		minute = String(String(0) + String(minute));
	}
	if(second < 10) { /*秒小于10  就在前面加个0*/
		second = String(String(0) + String(second));
	}
	if(msecond < 10) {
		msecond = "00" + msecond;
	} else if(msecond >= 10 && msecond < 100) {
		msecond = "0" + msecond;
	}
	var currentDate = String(year) + String(mouth) + String(day) + String(hour) +
		 String(minute) + String(second) + String(msecond);
	return currentDate;
}

//生成一串随机字符串
function getNonceStr() {       
	return Math.random().toString(36).substr(2, 15);  
}  


//签名算法
function paysignjsapi(appid, body, mchid, noncestr, openid, checkname, 
re_user_name, outtrade_no, spbillip, totalfee, mch_my) {
	console.log(mch_my + "这是密钥002")
	console.log(totalfee + "金额002")
	var ret = {
		mch_appid: appid,
		desc: body,
		mchid: mchid,
		nonce_str: noncestr,
		openid: openid,
		check_name: checkname,
		re_user_name: re_user_name,
		partner_trade_no: outtrade_no,
		spbill_create_ip: spbillip,
		amount: totalfee
	};
	
	var str = raw(ret); //签名排序
	str = str + '&key=' + mch_my;
	var md5Str = cryptoMO.createHash('md5').update(str).digest('hex');
	md5Str = md5Str.toUpperCase();
	return md5Str;
}

//签名排序
function raw(args) {
	var keys = Object.keys(args);
	keys = keys.sort();
	console.log(keys + "排序")
	var newArgs = {};
	keys.forEach(function(key) {
		newArgs[key.toLowerCase()] = args[key];
	});
	var str = '';
	for(var k in newArgs) {
		str += '&' + k + '=' + newArgs[k];
	}
	str = str.substr(1);
	return str;
}

你,要把她带走么?请在下面留个“1”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值