Nodejs实现微信分账的示例代码

让我来为你详细讲解 Node.js 实现微信分账的示例代码攻略。

一、前置准备

在开始编写代码之前,你需要先完成一些前置准备工作:

  1. 需要在微信支付商户平台中开通分账功能,具体操作方法可参考官方文档。

  2. 下载安装 Node.js 环境。

  3. 创建一个新的 Node.js 项目,安装 wechatpay-axios-pluginxml2js 模块,在项目根目录下执行以下命令:

shell
npm install wechatpay-axios-plugin xml2js --save

二、分账 API 使用流程

我们先来简要介绍一下分账 API 的使用流程:

  1. 请求授权接口,获取接口调用凭证。

  2. 发起分账请求,调用“请求分账 API”。

  3. 查询分账结果,调用“查询分账结果 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技术站

(1)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • Nodejs异步回调的优雅处理方法

    关于Node.js异步回调的优雅处理方法,以下是一份完整的攻略。 异步回调的问题 在Node.js中,由于其采用了单线程的机制,因此会采用异步的方式去处理I/O操作和网络请求等等,以避免阻塞进程。但是,异步调用往往会导致代码难以维护和理解的问题,尤其是多个异步调用发生嵌套的情况下。这个问题被俗称为“回调地狱”。 例如: getData(function (e…

    node js 2023年6月8日
    00
  • node.js中的require使用详解

    Node.js 中的 require 使用详解 什么是 require 在 Node.js 中,用于加载模块的方法叫做 require。我们可以通过 require 加载 Node.js 核心模块和第三方模块,也可以加载自定义模块。 require 的使用方式 加载核心模块 在使用 Node.js 的过程中,我们经常需要使用到一些核心模块,例如 fs、htt…

    node js 2023年6月8日
    00
  • Node.js实现爬取网站图片的示例代码

    下面是详细讲解Node.js实现爬取网站图片的示例代码的完整攻略。 什么是爬虫? 爬取网站图片是一种Web爬虫的应用,那么什么是爬虫呢?简单来说,爬虫就是通过模拟浏览器的方式去访问网站,并收集网站的数据。在收集数据的过程中,我们可以定位到需要的数据,去提取其中的有效信息。爬虫的应用非常广泛,可以用于数据挖掘、舆情分析、搜索引擎等多个领域。 推荐使用的第三方库…

    node js 2023年6月8日
    00
  • node.js遍历目录的方法示例

    当我们需要遍历一个目录的时候,node.js提供了多种方便的方法来完成这个操作。本篇攻略将会介绍几种常用的遍历目录的方法,以及它们的实现原理和应用场景。 1.使用fs.readdir()方法遍历目录 fs.readdir()是node.js中的一个内置模块,它可以读取指定目录下的所有文件和子目录。下面是使用fs.readdir()来遍历目录的示例代码: co…

    node js 2023年6月8日
    00
  • react diff 算法实现思路及原理解析

    React Diff 算法是 React 的核心算法之一,用于对比两个 Virtual DOM 树的差异,从而最小化对浏览器 DOM 树的操作,提高页面渲染性能。 下面是 React Diff 算法的实现思路及原理解析: 两棵 Virtual DOM 树的比较 React Diff 算法的核心就是对比两棵 Virtual DOM 树的差异。对比过程包括以下几…

    node js 2023年6月8日
    00
  • NodeJs内置模块超详细讲解

    下面是“NodeJs内置模块超详细讲解”的完整攻略。 NodeJs内置模块 NodeJs中有很多内置模块,包括文件系统、网络、加密、全局对象等等。这些内置模块可以帮助我们实现各种复杂的功能。我们来逐一介绍。 文件系统模块 文件系统模块通过NodeJs的fs模块来实现。它提供了一些常见的文件操作函数,比如读取、写入、删除文件等等。下面是一个简单的读取文件的示例…

    node js 2023年6月8日
    00
  • NodeJS使用JWT跨域身份验证方案详解

    NodeJS使用JWT跨域身份验证方案详解 什么是JWT? JWT(JSON Web Token)是一种基于JSON编码的轻量级的身份验证方式。它可以安全的用于通信双方之间传递信息,以验证发送方是否有权发送信息,并且可以保证接收方信息的完整性和真实性。 JWT由三部分组成,分别是header、payload和signature,而每一部分都是使用Base64…

    node js 2023年6月8日
    00
  • 捕获未处理的Promise错误方法

    当Promise在执行过程中出现错误,但该Promise的错误处理函数没有被调用时,这时就需要通过捕获未处理的Promise错误方法来处理该错误。 以下是完整的攻略: 1. 使用unhandledRejection事件捕获未处理的Promise错误 Node.js提供unhandledRejection事件,用于捕获未处理的Promise错误。当一个Prom…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部