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 模块开发及发布详解分享
Mar 07 NodeJs
详谈nodejs异步编程
Dec 04 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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
提问的智慧
2006/10/09 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
php绘制一个矩形的方法
2015/01/24 PHP
初学Javascript的一些总结
2008/11/03 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
js获取class的所有元素
2013/03/28 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
node.js 中间件express-session使用详解
2017/05/20 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
[01:31]完美与DOTA2历程
2014/07/31 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python创建和删除目录的方法
2015/04/29 Python
python读取文本中数据并转化为DataFrame的实例
2018/04/10 Python
Python对象属性自动更新操作示例
2018/06/15 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
工作睡觉检讨书
2014/02/25 职场文书
大明湖导游词
2015/02/03 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL