nodejs实现微信小程序支付

nodejs如何实现微信小程微信支付呢?之前也找了好多网上的教程,但并不能解决问题,后来通过自己的摸索,终于实现了,实属不易。废话不多说开始上代码(亲测有效,项目已经上线)!
首先附上附上微信支付的官方文档地址微信小程序支付官方文档
一定要特别注意以下几点:
1.在算签名的时候注意 ASCII的顺序 ,字段规则要完全参照官方的事例 (这里很重要的);
2.在这里插入图片描述
一定要注意这个总的流程图,调用一次支付,需要两次签名;第一次拼接完字段,请求官方支付接口,拿到返回的字段;第二次,用第一次请求成功的结果,进行字段拼接并签名,再返回给前端(这里一定要切记);
3.微信支付接口不需要证书,这里和提现不一样(很重要);

 const request = require('request-promise')
    const md5 = require('md5-node')	//引入md5加密模块
    const xml2js = require('xml2js')	//引入xml解析模块
    router.post('/pay', async function (ctx) {	//小程序微信支付
	var responseData = {}
	let orderId = Utils.getRandomStr(8) + ctx.request.body.orderId;	//商户订单号
	let openId = 'xxxxx';//支付用户的唯一用户标识
	let money = ctx.request.body.money;//支付金额
	let desc = ctx.request.body.desc;//支付的订单描述
	let nonceStr = Utils.getRandomStr(32);//生成随机字符串
	let totalFee = Number(money) * 100;//订单价格
	let signObj = {
		appid: appId,//小程序appid
		body: desc,//商品描述
		mch_id: mchId,//商户号
		nonce_str: nonceStr,//随机字符串
		notify_url: 'http://xxxxxx',//通知地址
		openid: openId,
		out_trade_no: orderId,//商品订单号
		spbill_create_ip: 'xxxxxxxxx',//本地服务器地址
		total_fee: totalFee,//商品价格
		trade_type: 'JSAPI' //交易类型,JSAPI为小程序交易类型
	}
	signObj.sign = getSignParam(signObj);
	let formData = getXmlParam(signObj);
	let payResult = await WeApiPay(formData);
	xml2js.parseString(payResult, function (error, result) {
		let reData = result.xml;
		if (reData.return_msg[0] == 'OK') {
			var timeStamp = new Date().getTime() + '';
			var signAginA = `appId=${reData.appid[0]}&nonceStr=${reData.nonce_str[0]}&package=prepay_id=${reData.prepay_id[0]}&signType=MD5&timeStamp=${timeStamp}&key=商户平台的商户秘钥`;
			var signAginAValue = md5(signAginA).toUpperCase();
			responseData = {
				outTradeNo: orderId,
				wxReturnCode: reData.return_code[0],
				wxReturnMsg: reData.return_msg[0],
				timeStamp: timeStamp,
				nonceStr: reData.nonce_str[0],
				package: "prepay_id=" + reData.prepay_id[0],
				paySign: signAginAValue
			}
		} else {
			responseData = {
				wxReturnCode: reData.return_code[0],
				wxReturnMsg: reData.return_msg[0]
			}
		}
	})
	try {
		//成功的处理
	} catch (err) {
		//失败处理
	}

    })

    /****************************** Util.js ******************************/
    //产生一个随机字符串,strLength值为多少,就生成长度为多少的字符串
    function getRandomStr(strLength) {
        var str = "";
        var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
        for (var i = 1; i <= strLength; i++) {
            var random = Math.floor(Math.random() * arr.length);
            str += arr[random];
        }
        return str;
    }
    module.exports= {
        getRandomStr
    }

打完,收工!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值