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全局安装和本地安装的不同之处
Jul 04 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
node快速搭建后台的实现步骤
Feb 18 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+mysql扎实个人基本功
2008/03/27 PHP
PHP如何解决网站大流量与高并发的问题
2011/06/25 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
简单的js计算器实现
2016/10/26 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
Python  __getattr__与__setattr__使用方法
2008/09/06 Python
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
编写strcpy函数
2014/06/24 面试题
作文评语大全
2014/04/23 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
工作检讨书500字
2014/10/19 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
入党团支部推荐意见
2015/06/02 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python