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


Posted in NodeJs onJanuary 19, 2021

公司的业务的场景需要用到微信分账的功能、对着官网文档调试了一下午才调通、记录下使用Nodejs微信分账的流程。

前提条件

  • 在微信商户平台 产品中心->我的产品,支付扩展工具中 开通分账的功能
  • 添加分账接收方。 这一步不设置的话回报一个*分账接收方关系不存在,请检查参数中每个接收方的关系。*错误
  • 在商户平台获取商户id和secrect
  • 需要将apiclient_cert.pem、 apiclient_key传到服务器某个目录下面

具体实现

// @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放到接口签名校验工具进行逐步验证、

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

分账接口其他常见问题

到此这篇关于Nodejs实现微信分账的示例代码的文章就介绍到这了,更多相关Nodejs 微信分账内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

NodeJs 相关文章推荐
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 NodeJs
nodejs中的异步编程知识点详解
Jan 17 #NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 #NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 #NodeJs
NodeJS配置CORS实现过程详解
Dec 02 #NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 #NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 #NodeJs
如何利用nodejs实现命令行游戏
Nov 24 #NodeJs
You might like
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
PHP下escape解码函数的实现方法
2010/08/08 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
PHP基于ORM方式操作MySQL数据库实例
2017/06/21 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
python 快速排序代码
2009/11/23 Python
django中的setting最佳配置小结
2017/11/21 Python
利用python3随机生成中文字符的实现方法
2017/11/24 Python
解决pycharm安装后代码区不能编辑的问题
2018/10/28 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
Python QT组件库qtwidgets的使用
2020/11/02 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
集团公司人力资源部岗位职责
2014/01/03 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
我去timi了,一起去timi是什么意思?
2022/04/13 杂记