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的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
详解nodejs中exports和module.exports的区别
Feb 17 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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转换文本框内容为HTML格式的方法
2016/07/20 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
小程序实现订单倒计时功能
2019/04/23 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
[05:08]DOTA2-DPC中国联赛3月6日Recap集锦
2021/03/11 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
PyCharm代码格式调整方法
2018/05/23 Python
python 内置模块详解
2019/01/01 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python安装后的目录在哪里
2020/06/21 Python
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
销售经理工作职责范文
2013/12/03 职场文书
欢迎家长标语
2014/10/08 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
简历中自我评价范文
2015/03/11 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
创业计划书之干洗店
2019/09/10 职场文书
MySQL之DML语言
2021/04/05 MySQL
Python中zipfile压缩包模块的使用
2021/05/14 Python