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
}
打完,收工!