Node.js 实现微信支付分账功能完整流程与代码示例
作者:后端茶话时间:2026-10-24 07:31:11浏览:453
本文详细介绍如何在 Node.js 环境下实现微信支付分账功能。内容涵盖在微信商户平台开通分账权限、添加接收方、配置证书与密钥等前置条件,并提供完整的 Node.js 后端代码示例。针对开发中常见的签名失败、接收方关系不存在等错误,提供了基于官方签名校验工具的排查思路与解决方案,帮助开发者快速完成分账接口对接。
针对公司业务场景中对微信支付分账功能的需求,经过对官方文档的仔细研读与调试,成功实现了相关功能。现将基于 Node.js 进行微信分账开发的完整流程记录如下,供后续参考。
开发前需满足以下前提条件:
- 登录微信商户平台,进入“产品中心”下的“我的产品”,在“支付扩展工具”栏目中找到并开通“分账”功能。
- 必须在商户平台添加分账接收方。若未配置接收方关系,调用接口时将报错:“*分账接收方关系不存在,请检查参数中每个接收方的关系。*”
- 从微信商户平台获取商户号(mch_id)及商户密钥(secret)。
- 将 apiclient_cert.pem 和 apiclient_key 文件上传至服务器指定目录,确保后端服务可读取这些证书文件。
以下是 Node.js 实现分账接口的核心代码逻辑:
// @router post -> share -> /common/payment/share
async share() {
const { ctx } = this
const nonce_str = ctx.service.wx.randomStr()
// 商户id
const mch_id = '123456'
// x小程序appid
const appid = 'wx123456'
// 订单号
const out_order_no = '1609745196755nFvdMaYub2'
// 微信支付订单号
const transaction_id = '4200000801202101044301662433'
// 商户secrect
const key = '9813490da1ffb80afaa36f6f1265e490'
// 这一块的参数官网文档上有详细的说明
const params = {
appid,
mch_id,
nonce_str,
out_order_no,
receivers: `[{"account": "123qwe","amount": 1,"description": "description","type": "PERSONAL_OPENID"}]`,
sign_type: 'HMAC-SHA256',
transaction_id,
}
// 签名方式必须是HMAC-SHA256
const sign = ctx.service.wx.sign(params, key, 'HMAC-SHA256')
// xmlString
const formData = `<xml>
<appid>${appid}</appid>
<mch_id>${mch_id}</mch_id>
<nonce_str>${nonce_str}</nonce_str>
<out_order_no>${out_order_no}</out_order_no>
<transaction_id>${transaction_id}</transaction_id>
<sign>${sign}</sign>
<sign_type>HMAC-SHA256</sign_type>
<receivers>${params.receivers}</receivers>
</xml>`
const res = await ctx.curl(
"https://api.mch.weixin.qq.com/secapi/pay/profitsharing",
{
// 需要使用证书apiclient_cert
cert: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_cert.pem')),
// 需要使用证书apiclient_key
key: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_key.pem')),
method: "post",
data: formData,
}
)
const datastring = res.data.toString()
xml2js.parseString(datastring, (err, result) => {
if (err) {
ctx.throw(422, err)
}
console.log(result)
})
}
// randomStr
// 生成随机字符串
randomStr(len = 24) {
const str =
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
let result = '';
for (let i = 0; i < len; i++) {
result += str[Math.floor(Math.random() * str.length)];
}
return result;
}
// 签名
// mchKey是商户secrect,否则签名不通过
sign(data, mchKey, signType = 'MD5') {
const keys = [];
for (const key in data) {
if (data[key] !== undefined) {
keys.push(key);
}
}
// 字典排序=>key=value
const stringA = keys
.sort()
.map(key => `${key}=${decodeURIComponent(data[key])}`)
.join('&');
// 拼接商户key
const stringSignTemp = stringA + '&key=' + mchKey;
// 加密
let hash;
if (signType === 'MD5') {
hash = crypto.createHash('md5').update(stringSignTemp);
} else {
hash = crypto.createHmac('sha256', mchKey).update(stringSignTemp, 'utf8');
}
const paySign = hash.digest('hex').toUpperCase();
return paySign;
}
若遇到签名校验不通过的问题,建议将生成的 formData 数据放入微信官方提供的“接口签名校验工具”中进行逐步验证,以定位参数或签名生成过程中的错误。

分账接口在实际调用中可能遇到其他常见问题,需结合具体报错信息排查。
至此,关于 Node.js 实现微信支付分账的示例代码介绍完毕。如需了解更多 Node.js 微信分账相关内容,建议搜索本站过往文章或继续浏览后续系列教程,感谢支持。
作者最新文章
Node.js中使用path模块获取文件名
2026-11-05 15:15:15
Node.js中url模块与querystring模块处理查询字符串的区别
2026-11-05 15:04:45
JavaScript(JS)主要用来做什么
2026-11-05 10:10:47
怎么修改Node.js和npm的全局安装路径与缓存目录
2026-11-04 19:48:28
NW.js 常见问题排查:Node 模块加载失败与版本兼容解决
2026-11-04 11:22:45
