让我来为你详细讲解 Node.js 实现微信分账的示例代码攻略。
一、前置准备
在开始编写代码之前,你需要先完成一些前置准备工作:
-
需要在微信支付商户平台中开通分账功能,具体操作方法可参考官方文档。
-
下载安装 Node.js 环境。
-
创建一个新的 Node.js 项目,安装
wechatpay-axios-plugin
和xml2js
模块,在项目根目录下执行以下命令:
shell
npm install wechatpay-axios-plugin xml2js --save
二、分账 API 使用流程
我们先来简要介绍一下分账 API 的使用流程:
-
请求授权接口,获取接口调用凭证。
-
发起分账请求,调用“请求分账 API”。
-
查询分账结果,调用“查询分账结果 API”。
下面我们就分别来详细说明这三个步骤。
三、请求授权接口
const axios = require('axios').default;
const config = {
mchid: 'YOUR_MCH_ID',
secret: 'YOUR_MCH_SECRET',
};
async function getAuthCode() {
const url = 'https://api.mch.weixin.qq.com/v3/applyment4sub/sub_merchants/changeloginid';
const data = {
login_id: 'YOUR_SUB_MCH_ID',
};
const nonceStr = 'Wm3WZYTPz0wzccnW';
const timestamp = (new Date().getTime() / 1000).toFixed(0);
const message = {
method: 'POST',
url: url.replace(/https:\/\/[\w/.]+/, ''),
nonce_str: nonceStr,
timestamp: timestamp,
body: JSON.stringify(data),
};
const signature = genSignature(message, config.secret);
const headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': `WECHATPAY2-SHA256-RSA2048 mchid="${config.mchid}",serial_no="${serialNo}",timestamp="${timestamp}",nonce_str="${nonceStr}",signature="${signature}"`,
};
const resp = await axios.post(url, data, { headers });
return resp.data.authorization_code;
}
这段代码演示了如何请求授权接口,获取接口调用凭证 authorization_code。其中,需要传入商户号和子商户号,以及生成签名的密钥等参数。
四、发起分账请求
const axios = require('axios').default;
const { parseStringPromise } = require('xml2js');
const config = {
mchid: 'YOUR_MCH_ID',
secret: 'YOUR_MCH_SECRET',
};
async function profitSharing(req) {
const url = 'https://api.mch.weixin.qq.com/secapi/pay/profitsharing';
const amount = req.amount;
const receiverList = req.receiverList;
const data = {
transaction_id: req.transactionId,
out_order_no: req.outOrderNo,
receivers: receiverList.map(receiver => ({
type: 'MERCHANT_ID',
account: receiver.account,
name: receiver.name,
amount: Math.floor(receiver.amount * 100),
description: receiver.description,
})),
};
const nonceStr = 'Wm3WZYTPz0wzccnW';
const timestamp = (new Date().getTime() / 1000).toFixed(0);
const message = {
method: 'POST',
url: url.replace(/https:\/\/[\w/.]+/, ''),
nonce_str: nonceStr,
timestamp: timestamp,
body: JSON.stringify(data),
};
const serialNo = await getSerialNo();
const signature = genSignature(message, config.secret);
const headers = {
'Content-Type': 'application/xml',
'Accept': 'application/xml',
'Authorization': `WECHATPAY2-SHA256-RSA2048 mchid="${config.mchid}",serial_no="${serialNo}",timestamp="${timestamp}",nonce_str="${nonceStr}",signature="${signature}"`,
};
const resp = await axios.post(url, data, { headers });
const resData = await parseStringPromise(resp.data, { explicitArray: false });
return {
code: resData.xml.return_code,
message: resData.xml.return_msg,
data: resData.xml,
};
}
这段代码演示了如何发起分账请求,其中需要传入分账金额、分账接收方列表、接口调用凭证等参数,并对参数进行处理,最后生成签名并发送请求。请求结果返回之后,将返回码和返回消息封装在一个对象中返回。
五、查询分账结果
const axios = require('axios').default;
const { parseStringPromise } = require('xml2js');
const config = {
mchid: 'YOUR_MCH_ID',
secret: 'YOUR_MCH_SECRET',
};
async function queryProfitSharing(req) {
const url = 'https://api.mch.weixin.qq.com/pay/profitsharingquery';
const data = {
transaction_id: req.transactionId,
out_order_no: req.outOrderNo,
};
const nonceStr = 'Wm3WZYTPz0wzccnW';
const timestamp = (new Date().getTime() / 1000).toFixed(0);
const message = {
method: 'GET',
url: url.replace(/https:\/\/[\w/.]+/, ''),
nonce_str: nonceStr,
timestamp: timestamp,
query: data,
};
const serialNo = await getSerialNo();
const signature = genSignature(message, config.secret);
const headers = {
'Content-Type': 'application/xml',
'Accept': 'application/xml',
'Authorization': `WECHATPAY2-SHA256-RSA2048 mchid="${config.mchid}",serial_no="${serialNo}",timestamp="${timestamp}",nonce_str="${nonceStr}",signature="${signature}"`,
};
const resp = await axios.get(url, { params: data, headers });
const resData = await parseStringPromise(resp.data, { explicitArray: false });
return {
code: resData.xml.return_code,
message: resData.xml.return_msg,
data: resData.xml,
};
}
这段代码演示了如何查询分账结果,其中需要传入分账订单号、商户订单号等参数,并生成签名并发送请求。请求结果返回之后,将返回码和返回消息封装在一个对象中返回。
六、示例说明
下面我们来举两个例子说明如何使用上述代码实现微信分账:
1. 发起分账请求
const receiverList = [
{
account: 'YOUR_SUB_MCH_ID',
name: '微信支付分配的商户号',
amount: 100,
description: '分账测试1',
},
{
account: 'ANOTHER_SUB_MCH_ID',
name: '微信支付分配的另一个商户号',
amount: 50,
description: '分账测试2',
},
];
const req = {
transactionId: 'YOUR_TRANSACTION_ID', // 微信订单号
outOrderNo: 'YOUR_OUT_ORDER_NO', // 商户分账单号
amount: 150, // 分账总金额
receiverList, // 分账接收方列表
};
const res = await profitSharing(req);
console.log(res);
以上代码将请求发起并接收返回结果。
2. 查询分账结果
const req = {
transactionId: 'YOUR_TRANSACTION_ID', // 微信订单号
outOrderNo: 'YOUR_OUT_ORDER_NO', // 商户分账单号
};
const res = await queryProfitSharing(req);
console.log(res);
以上代码将请求发起并接收返回结果。
以上是 Node.js 实现微信分账的示例代码的完整攻略。如果你有问题,欢迎在评论区留言。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs实现微信分账的示例代码 - Python技术站