Nodejs-微信支付接入示例
代码示例
import request from 'request';
import xml2js from 'xml2js';
import qrcode from 'qrcode';
import fs from 'fs';
import { createHash } from 'crypto';
// 微信小程序的appid
const appid = 'wxa4*********228';
// 商户号
const mch_id = '16*******67';
// 密钥
const key = 'd94***********d58a7';
// 统一下单接口函数
function unifiedOrder(params, callback) {
// 设置公共参数
params.appid = appid;
params.mch_id = mch_id;
params.nonce_str = generateNonceString();
params.trade_type = 'NATIVE';
params.sign = generateSign(params);
// 构建请求body的XML格式
const builder = new xml2js.Builder();
const xml = builder.buildObject({ xml: params });
// 发送请求
request.post(
{
url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
body: xml,
},
function (error, response, body) {
// 请求成功
if (!error && response.statusCode === 200) {
parseXML(body, callback);
} else { // 请求失败
callback(error || '请求失败');
}
}
);
}
// 生成随机字符串
function generateNonceString(length = 32) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let nonceStr = '';
for (let i = 0; i < length; i++) {
nonceStr += chars.charAt(Math.floor(Math.random() * chars.length));
}
return nonceStr;
}
// 生成签名
function generateSign(params) {
const keys = Object.keys(params).sort();
const string = keys
.filter((key) => params[key] !== undefined && params[key] !== '')
.map((key) => key + '=' + params[key])
.join('&');
const stringSignTemp = string + '&key=' + key;
const sign = createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase();
return sign;
}
// 解析XML格式的响应数据
function parseXML(xml, callback) {
const parser = new xml2js.Parser({
explicitArray: false,
ignoreAttrs: true,
});
parser.parseString(xml, function (error, result) {
if (error) {
callback(error);
} else {
callback(null, result);
}
});
}
// 调用统一下单接口
const params = {
body: '测试商品', // 商品描述
out_trade_no: '123456789', // 商户订单号
total_fee: 1, // 订单金额,单位分
spbill_create_ip: '123.123.123.123', // 服务器IP地址
notify_url: 'http://.com', // 微信支付结果通知的地址
};
unifiedOrder(params, function (error, result) {
if (error) { // 下单失败
console.error(error);
} else { // 下单成功
// 生成二维码
qrcode.toFile(
'qrcode.png', // 保存二维码图片的路径
result.xml.code_url, // 生成二维码的文本内容
{
errorCorrectionLevel: 'H',
type: 'png',
scale: 10,
},
function (error) {
if (error) { // 生成二维码失败
console.error('生成二维码失败:', error);
} else { // 生成二维码成功
console.log('二维码已生成');
// 读取二维码图片文件
fs.readFile('qrcode.png', function (error, data) {
if (error) { // 读取二维码文件失败
console.error('读取二维码文件失败:', error);
} else { // 读取二维码文件成功
// 将二维码转换为Base64格式
const base64Data = data.toString('base64');
console.log('Base64格式的二维码:', base64Data);
// 删除二维码图片文件
fs.unlink('qrcode.png', function (error) {
if (error) { // 删除二维码文件失败
console.error('删除二维码文件失败:', error);
} else { // 删除二维码文件成功
console.log('二维码文件已删除');
}
});
}
});
}
}
);
}
});
实现了微信统一下单功能,并生成一个二维码
request
: 用于发送HTTP请求。
xml2js
: 用于解析XML格式的响应数据。
qrcode
: 用于生成二维码图片。
fs
: 用于读取和删除文件。
crypto
: 用于生成签名。
定义微信小程序的 appid
、商户号和密钥。