• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
唐伯狼乌 显示全部楼层 发表于 2021-10-25 19:52:41 |阅读模式 打印 上一主题 下一主题
公司的业务的场景必要用到微信分账的功能、对着官网文档调试了一下战书才调通、记载下使用Nodejs微信分账的流程。
条件条件


      
  • 在微信商户平台 产品中心->我的产品,付出扩展工具中 开通分账的功能  
  • 添加分账吸取方。 这一步不设置的话回报一个*分账吸取方关系不存在,请查抄参数中每个吸取方的关系。*错误  
  • 在商户平台获取商户id和secrect  
  • 必要将apiclient_cert.pem、 apiclient_key传到服务器某个目录下面
具体实现
  1. // @router post -> share -> /common/payment/share
  2. async share() {
  3. const { ctx } = this
  4. const nonce_str = ctx.service.wx.randomStr()
  5. // 商户id
  6. const mch_id = '123456'
  7. // x小程序appid
  8. const appid = 'wx123456'
  9. // 订单号
  10. const out_order_no = '1609745196755nFvdMaYub2'
  11. // 微信支付订单号
  12. const transaction_id = '4200000801202101044301662433'
  13. // 商户secrect
  14. const key = '9813490da1ffb80afaa36f6f1265e490'
  15. // 这一块的参数官网文档上有详细的说明
  16. const params = {
  17.   appid,
  18.   mch_id,
  19.   nonce_str,
  20.   out_order_no,
  21.   receivers: `[{"account": "123qwe","amount": 1,"description": "description","type": "PERSONAL_OPENID"}]`,
  22.   sign_type: 'HMAC-SHA256',
  23.   transaction_id,
  24. }
  25. // 签名方式必须是HMAC-SHA256
  26. const sign = ctx.service.wx.sign(params, key, 'HMAC-SHA256')
  27. // xmlString
  28. const formData = `<xml>
  29.   <appid>${appid}</appid>
  30.   <mch_id>${mch_id}</mch_id>
  31.   <nonce_str>${nonce_str}</nonce_str>
  32.   <out_order_no>${out_order_no}</out_order_no>
  33.   <transaction_id>${transaction_id}</transaction_id>
  34.   <sign>${sign}</sign>
  35.   <sign_type>HMAC-SHA256</sign_type>
  36.   <receivers>${params.receivers}</receivers>
  37. </xml>`
  38. const res = await ctx.curl(
  39.   "https://api.mch.weixin.qq.com/secapi/pay/profitsharing",
  40.   {
  41.    // 需要使用证书apiclient_cert
  42.    cert: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_cert.pem')),
  43.    // 需要使用证书apiclient_key
  44.    key: fs.readFileSync(path.join(__dirname,'../../../cert/apiclient_key.pem')),
  45.    method: "post",
  46.    data: formData,
  47.   }
  48. )
  49. const datastring = res.data.toString()
  50. xml2js.parseString(datastring, (err, result) => {
  51.   if (err) {
  52.    ctx.throw(422, err)
  53.   }
  54.   console.log(result)
  55. })
  56. }
  57. // randomStr
  58. // 生成随机字符串
  59. randomStr(len = 24) {
  60. const str =
  61.   'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  62. let result = '';
  63. for (let i = 0; i < len; i++) {
  64.   result += str[Math.floor(Math.random() * str.length)];
  65. }
  66. return result;
  67. }
  68. // 签名
  69. // mchKey是商户secrect,否则签名不通过
  70. sign(data, mchKey, signType = 'MD5') {
  71. const keys = [];
  72. for (const key in data) {
  73.   if (data[key] !== undefined) {
  74.    keys.push(key);
  75.   }
  76. }
  77. // 字典排序=>key=value
  78. const stringA = keys
  79.   .sort()
  80.   .map(key => `${key}=${decodeURIComponent(data[key])}`)
  81.   .join('&');
  82. // 拼接商户key
  83. const stringSignTemp = stringA + '&key=' + mchKey;
  84. // 加密
  85. let hash;
  86. if (signType === 'MD5') {
  87.   hash = crypto.createHash('md5').update(stringSignTemp);
  88. } else {
  89.   hash = crypto.createHmac('sha256', mchKey).update(stringSignTemp, 'utf8');
  90. }
  91. const paySign = hash.digest('hex').toUpperCase();
  92. return paySign;
  93. }
复制代码
如果碰到签名不通过的题目。可以将你天生的formData放到接口签名校验工具举行徐徐验证、

分账接口其他常见题目
到此这篇关于Nodejs实现微信分账的示例代码的文章就先容到这了,更多相关Nodejs 微信分账内容请搜索草根技术分享从前的文章或继续欣赏下面的相关文章盼望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作