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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 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
一个简单的PHP&amp;MYSQL留言板源码
2020/07/19 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
浅谈JavaScript函数的四种存在形态
2016/06/08 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
Node.Js生成比特币地址代码解析
2018/04/21 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
Django权限设置及验证方式
2020/05/13 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
介绍下Java中==和equals的区别
2013/09/01 面试题
资产评估专业学生的自我鉴定
2013/11/14 职场文书
网络技术专业求职信
2014/05/02 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
实习单位证明范例
2014/11/17 职场文书
色戒观后感
2015/06/12 职场文书
Redis三种集群模式详解
2021/10/05 Redis
MySQL数据库表约束讲解
2022/06/21 MySQL