Node.js关于微信支付V3版相关处理方法

这篇具有很好参考价值的文章主要介绍了Node.js关于微信支付V3版相关处理方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

node 微信支付 v3版本签名生成,区块链,安全,密码学,nodejs,加密解密

今天给大家写一个关于Node.js接入微信支付V3接口时一些毕竟复杂的点,主要就是请求签名Authorization、调起支付签名、回调参数解密等。

  • 请求签名Authorization

在微信支付V3接口中,商户需要使用自身的私钥对API URL、消息体等关键数据的组合进行SHA-256 with RSA签名。请求的签名信息通过HTTP头Authorization传递,具体说明可以去看签名生成指南。没有携带签名或者签名验证不通过的请求,都不会被执行,并返回401 Unauthorized 。

那么如何生成这个Authorization呢,这个请求头,最麻烦的地方就是如何去生成

signature,其中我们使用jsrsasign模块来进行SHA256 with RSA加密,可以查看如下代码:

const {KJUR, hextob64} = require('jsrsasign')


rsaSign(content, privateKey, hash='SHA256withRSA'){
    const signature = new KJUR.crypto.Signature({
            alg: hash,
            prvkeypem: privateKey
        })
    signature.updateString(content)
    const signData = signature.sign()
    // 将内容转成base64
    return hextob64(signData)
}


//调用这个函数
let signature = this.rsaSign(`${method}\n${pathname}\n${timestamp}\n${onece_str}\n${bodyParamsStr}\n`,this.private_key,'SHA256withRSA')


//获取到signature后就可以获取到Authorization了
 let Authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",nonce_str="${onece_str}",timestamp="${timestamp}",signature="${signature}",serial_no="${serial_no}"`

其中mchid:商户号,onece_str:随机字符,timestamp:时间戳,serial_no:商户API证书序列号。这样在请求时在请求头里加入就可以了,如下:

headers:{
     'Content-Type':'application/json',
     'Accept':'application/json',
     'Authorization':Authorization
}

调起支付签名

通过上述请求后可以得到预支付交易会话标识prepay_id,然后我们需要再次进行签名,用于调起微信支付,代码如下:

paysign(options) { 
     let timeStamp = this.createTimeStamp(), //时间戳
         nonceStr = this.randomString(), //32位随机数
         Ppackage = `prepay_id=${options}`, //prepay_id
         signType = 'RSA'; //加签方式
     let PpaySign = `${this.appId}\n${timeStamp}\n${nonceStr}\n${Ppackage}\n`; //需要加签的字段拼接
     let cryptStr = this.rsaSign(PpaySign, this.privateKey, 'SHA256withRSA'); //生成签名
     let paySign = cryptStr;
     return {
         timeStamp,
         nonceStr,
         package: Ppackage,
         signType,
         paySign
     };
}

这里的rsaSign()函数就是上文提到的加密函数,只是这里的content参数有所不同而已,这样我们就可以直接调用起微信支付了。

回调参数解密

微信支付的回调都是需要验证解密之后才可以得到订单数据的,所以解密也是比较复杂的地方,这里我们使用crypto模块,对参数进行解密,代码如下:

const crypto = require("crypto");


 decode(params) {
        const AUTH_KEY_LENGTH = 16;
        // ciphertext = 密文,associated_data = 填充内容, nonce = 位移
        const { ciphertext, associated_data, nonce } = params;
        // 密钥
        const key_bytes = Buffer.from(this.apiv3_private_key, 'utf8');
        // 位移
        const nonce_bytes = Buffer.from(nonce, 'utf8');
        // 填充内容
        const associated_data_bytes = Buffer.from(associated_data, 'utf8');
        // 密文Buffer
        const ciphertext_bytes = Buffer.from(ciphertext, 'base64');
        // 计算减去16位长度
        const cipherdata_length = ciphertext_bytes.length - AUTH_KEY_LENGTH;
        // upodata
        const cipherdata_bytes = ciphertext_bytes.slice(0, cipherdata_length);
        // tag
        const auth_tag_bytes = ciphertext_bytes.slice(cipherdata_length, ciphertext_bytes.length);
        const decipher = crypto.createDecipheriv(
            'aes-256-gcm', key_bytes, nonce_bytes
        );
        decipher.setAuthTag(auth_tag_bytes);
        decipher.setAAD(Buffer.from(associated_data_bytes));


        const output = Buffer.concat([
            decipher.update(cipherdata_bytes),
            decipher.final(),
        ]);
        return output;
}

其中就是params回调返回值里的resource参数,这样就可以得到回调返回的信息了。文章来源地址https://www.toymoban.com/news/detail-795615.html

到了这里,关于Node.js关于微信支付V3版相关处理方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Node.js 应用的御用品: Node.js 错误处理系统

    开发中,有些开发者会积极寻求处理错误,力求减少开发时间,但也有些人完全忽略了错误的存在。正确处理错误不仅意味着能够轻松发现和纠正错误,而且还意味着能够为大型应用程序开发出稳健的代码库。 特别是对于 Node.js 开发人员,他们有时会也发现自己使用了不那么

    2024年02月10日
    浏览(55)
  • Node.js与相关依赖的版本对照表

    目录 1. node版本与Npm版本对照表 2. node版本与node-sass版本对照表 3. node-sass与sass-loader版本对照表 以往的版本 | Node.js 下面显示最新的对应内容,如果需要查找历史版本,可以进入上面的页面查询 Version LTS Date V8 npm NODE_MODULE_VERSION[1] Node.js 19.5.0 2023-01-24 10.8.168.25 9.3.1 111 下载 更新

    2023年04月23日
    浏览(76)
  • 关于 Angular 和 Node.js 版本的问题

    只有 Angular 12 才支持 Node.js 16 吗?Angular 10 呢? StackOverflow 有朋友抱怨关于 Angular 和 Node.js 版本的问题: 我的实际工作中,经常不得不启动旧的 Angular 项目,其中包含已弃用的 Angular 依赖项。 因为我经常运行最新的 Node.js 版本(至少是最新的 LTS 版本),所以我经常遇到无法

    2024年02月04日
    浏览(47)
  • 【node.js】关于node.js,如何解决npm should be run outside of the Node.js REPL, in your normal shell报错?

    前言,安装node方式采用的是安装包解压的 报如下错误: npm should be run outside of the Node.js REPL, in your normal shell 在windows环境下安装完node,其目录结构下会有一个node.exe文件,运行该工具就相当于在cmd中执行node命令,即进入node开发模式。 产生这个错误的原因是你将npm命令运行在

    2024年02月03日
    浏览(52)
  • Node.js同时安装多个版本以及相关配置(简单易操作)

    Node.js是一个基于V8引擎的开源运行时环境,用于在服务器端运行JavaScript代码。它允许您使用JavaScript来编写服务器端应用程序,如网络应用、API和后端服务,而不仅仅局限于在浏览器中执行。Node.js的非阻塞I/O和事件驱动的特性使其特别适合处理高并发的网络应用程序。本篇主

    2024年02月06日
    浏览(41)
  • 「NodeJs进阶」超全面的 Node.js 性能优化相关知识梳理

    相信对于前端同学而言,我们去开发一个自己的简单后端程序可以借助很多的nodeJs的框架去进行快速搭建,但是从前端面向后端之后,我们会在很多方面会稍显的有些陌生,比如「性能分析」,「性能测试」,「内存管理」,「内存查看」,「使用C++插件」,「子进程」,「

    2024年02月01日
    浏览(53)
  • 【Node.js】path 模块进行路径处理

    Node.js 执行 JS 代码时,代码中的路径都是以终端所在文件夹出发查找相对路径,而不是以我们认为的从代码本身出发,会遇到问题,所以在 Node.js 要执行的代码中,访问其他文件,建议使用绝对路径 实例: 问题原因:就是从代码文件夹出发,使用 ../text.txt 解析路径,找不到

    2024年02月20日
    浏览(53)
  • 【从0配置JAVA项目相关环境2】node.js + 前端 从配置到运行

    实验室电脑,需要跑一个前后端分离的JAVA项目,于是开始重新配置 全部(数据库+后端+前端)配置环境+修改代码 耗时6h,包括遇到各种坑,但总体而言弯路走的不多 如果跟着这篇博客走,理论上会避开我遇到的那些坑hh 对于前端开发者来说,我们也没有遗漏。文章将详细介

    2024年02月04日
    浏览(42)
  • 使用ExcelJS快速处理Node.js爬虫数据

    ExcelJS是一个用于处理Excel文件的JavaScript库。它可以让你使用JavaScript创建、读取和修改Excel文件。 以下是ExcelJS的一些主要特点: 支持xlsx、xlsm、xlsb、xls格式的Excel文件。 可以创建和修改工作表、单元格、行和列。 可以设置单元格样式、字体、背景颜色等。 可以设置工作表的

    2024年02月03日
    浏览(49)
  • node.js系列-常见问题处理方案(持续更新)

    `` 浏览器中我们可以这样使用: node.js中实现方案 解决方案: 修改eslint配置文件 , 举个栗子:.eslintrc.js 使用方案 今天就写到这里啦~ 小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~ 大家要天天开心哦 欢迎大家指出文章需要改正之处~ 学无止境,合作共赢 欢迎路过

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包