node对接微信支付用到了npm的一个包tenpay,首先在项目中执行npm install tenpay --save,将包下载到项目中,我用的是node的express
const tenpay = require('tenpay'); // 引入微信支付SDK
const config = {
appid: 'xxx', // 应用id
mchid: 'xxx', // 微信商户号
partnerKey: 'xxx', // 微信支付安全密匙
pfx: require('fs').readFileSync('xxx'), // 证书文件(后缀.12)
notify_url: 'xxx', // 支付/退款结果回调
refund_url: 'https://www.dadaex.cn/api/pay/wxRefund', // 退款结果通知回调(可不填,沿用上面的路径)
};
// 传入第二个参数为true, 可在控制台输出数据
const api = new tenpay(config, true);
class Get {
constructor() {
auto(this)
}
async wxPay(req, res, next) {
try {
const { totalAmount, subject, body } = req.query
const result = await api.unifiedOrder({
out_trade_no: outTradeNo, // 订单号码,不能重复,我用的是订单的id加上日期拼成的字符串
body: body, // 订单名称
total_fee: totalAmount, // 支付金额(单位:分,0.01等于1分)
trade_type: 'NATIVE' // 调用的支付类型,默认为JSAPI
});
QRCode.toString(result.code_url, { type: 'svg' }, function (err, url) {
if (err) return res.json(err)
// url将链接转为了二维码
// 最后再转为base64格式返回给前端
return res.json('data:image/svg+xml;base64,' + Buffer(url).toString('base64'))
})
} catch (error) {
return next(error)
}
}
}
发送请求后微信会返回一个链接,需要自己转成二维码,网址草料二维码生成器,支付完成后微信会发送通知到上面写的接口里面,qrcode将微信返回的链接转为二维码
app.use(bodyParser.text({ type: '*/xml' })) // 将收到的xml数据转为String类型
后台接口路由里面内容
const { router } = require('../../util')
const tenpay = require('tenpay');
// 微信支付
const config = {
appid: 'xxx', // 应用id
mchid: 'xxx', // 微信商户号
partnerKey: 'xxx', // 微信支付安全密匙
pfx: require('fs').readFileSync('xxx'), // 证书文件
notify_url: 'xxx', // 支付结果回调
refund_url: '', // 退款结果通知回调
};
const api = new tenpay(config, true);
.post('/wxCallback', api.middlewareForExpress('nativePay'), (req,res) => {
let info = req.weixin // 返回的数据通过中间件后会将req.weixin转成存放将xml转成json数据的容器
console.log(req.weixin)
res.reply() // 告诉微信支付成功了,不要再发送请求了
})