服务器之家:专注于服务器技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - node.js - Nodejs实现微信分账的示例代码

Nodejs实现微信分账的示例代码

2022-01-04 16:40Hi__Z node.js

这篇文章主要介绍了Nodejs实现微信分账的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

公司的业务的场景需要用到微信分账的功能、对着官网文档调试了一下午才调通、记录下使用Nodejs微信分账的流程。

前提条件

  • 在微信商户平台 产品中心->我的产品,支付扩展工具中 开通分账的功能
  • 添加分账接收方。 这一步不设置的话回报一个*分账接收方关系不存在,请检查参数中每个接收方的关系。*错误
  • 在商户平台获取商户id和secrect
  • 需要将apiclient_cert.pem、 apiclient_key传到服务器某个目录下面

具体实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// @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 微信分账内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6919029086681563150

延伸 · 阅读

精彩推荐
  • node.jsnodejs中使用worker_threads来创建新的线程的方法

    nodejs中使用worker_threads来创建新的线程的方法

    这篇文章主要介绍了nodejs中使用worker_threads来创建新的线程的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...

    flydean程序那些事8982022-01-06
  • node.jsrequire加载器实现原理的深入理解

    require加载器实现原理的深入理解

    这篇文章主要给大家介绍了关于require加载器实现原理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    隐冬8462022-03-03
  • node.jsNode.js ObjectWrap 的弱引用问题

    Node.js ObjectWrap 的弱引用问题

    最近在写 Node.js Addon 的过程中,遇到了一个问题,然后发现是 ObjectWrap 弱引用导致的,本文介绍一下具体的问题和排查过程,以及 ObjectWrap 的使用问题。...

    编程杂技9852022-01-04
  • node.jsk8s node节点重新加入master集群的实现

    k8s node节点重新加入master集群的实现

    这篇文章主要介绍了k8s node节点重新加入master集群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    Scarborought13922022-01-22
  • node.jslinux服务器快速卸载安装node环境(简单上手)

    linux服务器快速卸载安装node环境(简单上手)

    这篇文章主要介绍了linux服务器快速卸载安装node环境(简单上手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    mose-x8462022-01-22
  • node.js在浏览器中,把 Vite 跑起来了!

    在浏览器中,把 Vite 跑起来了!

    大家好,我是 ssh,前几天在推上冲浪的时候,看到 Francois Valdy 宣布他制作了 browser-vite[1],成功把 Vite 成功在浏览器中运行起来了。这引起了我的兴趣,如...

    前端从进阶到入院9282022-01-11
  • node.js详解node.js创建一个web服务器(Server)的详细步骤

    详解node.js创建一个web服务器(Server)的详细步骤

    这篇文章主要介绍了详解node.js创建一个web服务器(Server)的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,...

    王佳斌8952021-12-31
  • node.jsNode.js 中如何收集和解析命令行参数

    Node.js 中如何收集和解析命令行参数

    这篇文章主要介绍了Node.js 中如何收集和解析命令行参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    descire8802021-12-28