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使用jQuery选择器操作DOM
Feb 13 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
详解Nodejs内存治理
May 13 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jquery 新浪网易的评论块制作
2010/07/01 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Python简单删除目录下文件以及文件夹的方法
2015/05/27 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
pywinauto自动化操作记事本
2019/08/26 Python
Django实现文件上传和下载功能
2019/10/06 Python
谈谈python垃圾回收机制
2020/09/27 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
大二自我鉴定范文
2013/10/05 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
内乡县衙导游词
2015/02/05 职场文书
小学感恩主题班会
2015/08/12 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏