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 Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
初探nodeJS
Jan 24 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
M2实现Nodejs项目自动部署的方法步骤
May 05 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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来处理多个提交任务
2006/10/09 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
详解javascript中的babel到底是什么
2018/06/21 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
使用Python写CUDA程序的方法
2017/03/27 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Python requests模块cookie实例解析
2020/04/14 Python
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
怎样客观的做好自我评价
2013/12/28 职场文书
九年级语文教学反思
2014/02/04 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
护士节慰问信
2015/02/15 职场文书
实习护士自荐信
2015/03/25 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
《灰雀》教学反思
2016/02/19 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js