Node.js中接入微信支付
在Node.js中接入微信支付主要涉及到使用微信支付的API来处理支付请求、订单查询、退款等操作。以下是一个基本的步骤指南,帮助你在Node.js服务器上实现微信支付功能。
1. 注册并配置微信支付商户账号
首先,你需要在微信支付平台(https://pay.weixin.qq.com/)注册成为微信支付商户,并获取必要的API密钥、商户ID(MCHID)等信息。
2. 安装必要的Node.js库
在Node.js项目中,你可能需要使用一些库来帮助你处理HTTPS请求和XML解析,例如axios
和xml2js
。你可以通过npm
来安装这些库:
npm install axios xml2js
3. 创建支付请求
微信支付通常要求你通过HTTPS POST请求发送加密后的XML数据。你需要构造一个包含订单信息的XML字符串,然后使用微信提供的API密钥进行签名。
示例代码:
const axios = require('axios');
const xml2js = require('xml2js');
// 示例函数,用于发送支付请求
async function createPayment(orderInfo) {
const xmlBuilder = new xml2js.Builder();
const xml = xmlBuilder.buildObject({
xml: {
$: {
version: '1.0',
encoding: 'UTF-8',
},
appid: '你的APPID',
mch_id: '你的商户号',
nonce_str: '随机字符串', // 随机字符串
sign: '使用API密钥生成的签名', // 生成的签名
body: '商品描述',
out_trade_no: '商户订单号', // 唯一的订单号
total_fee: '订单总金额', // 订单金额(单位:分)
spbill_create_ip: '用户端实际ip', // 客户端IP
notify_url: '通知地址', // 支付结果通知的回调URL
trade_type: 'JSAPI', // 交易类型,JSAPI、NATIVE、APP等
openid: '用户的openid(JSAPI支付时必填)',
}
});
try {
// 发送支付请求
const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', xml, {
headers: {
'Content-Type': 'text/xml',
},
});
// 解析返回的XML
const resXml = await new Promise((resolve, reject) => {
xml2js.parseString(response.data, (err, result) => {
if (err) reject(err);
resolve(result);
});
});
// 处理响应结果
if (resXml.xml.return_code[0] === 'SUCCESS' && resXml.xml.result_code[0] === 'SUCCESS') {
// 微信返回成功,获取prepay_id等信息
console.log('支付成功,预支付ID:', resXml.xml.prepay_id[0]);
// 这里可以将prepay_id等信息返回给前端,前端调用微信支付API进行支付
} else {
console.error('支付失败,错误信息:', resXml.xml.err_code_des[0]);
}
} catch (error) {
console.error('请求失败', error);
}
}
// 注意:上面的示例中省略了签名生成和随机字符串生成的逻辑
在以上示例中,首先使用xml2js.Builder()
构建XML格式的数据,然后通过axios.post
发送POST请求到微信支付的统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder
)。收到响应后,通过xml2js.parseString
解析XML数据。
4. 处理支付结果
微信支付会向你的notify_url
发送支付结果通知。你需要在这个URL对应的处理程序中验证通知的真实性(通过验证签名),并据此更新订单状态等。
示例代码:
const express = require('express');
const app = express();
const xmlParser = require('express-xml-bodyparser');
// 处理微信支付结果通知
app.post('/wechat/notify', xmlParser({trim: true, explicitArray: false}), (req, res) => {
const notifyData = req.body.xml;
// 验证签名 (略去具体签名验证逻辑)
const isValid = verifySign(notifyData); // 假设有个签名验证函数
if (isValid && notifyData.return_code === 'SUCCESS') {
// 支付成功,更新订单状态
console.log('支付成功,订单号:', notifyData.out_trade_no);
// 这里可以更新订单状态
res.send('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
} else {
console.error('支付失败:', notifyData.return_msg);
res.send('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>');
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
在这个例子中,我们使用express-xml-bodyparser
解析支付通知中的XML数据,然后根据签名验证结果和支付状态决定如何处理订单,并向微信返回处理结果。
5. 注意事项
- 确保处理好所有可能的错误情况,包括网络错误、参数错误等。
- 微信支付的安全要求很高,务必妥善保管你的API密钥等敏感信息。
- 微信支付API的调用频率有限制,需要合理控制请求频率。
- 微信支付文档(https://pay.weixin.qq.com/wiki/doc/api/index.shtml)是学习和调试微信支付功能的重要资源。
通过以上步骤,你就可以在Node.js中成功接入微信支付了。根据具体业务逻辑,你可以扩展代码实现更多功能,如订单查询、退款等。