详解NodeJs支付宝移动支付签名及验签

下面是详解NodeJs支付宝移动支付签名及验签的完整攻略:

1. NodeJs中使用支付宝移动支付签名及验签

1.1. 签名

在支付宝移动支付中,签名是用于防止数据篡改的重要手段。在NodeJs中,使用以下代码可生成签名:

const crypto = require('crypto');

function getSign(params, privateKey) {
  const unsortedString = Object.keys(params).sort().map(key => {
    return key + '=' + params[key];
  }).join('&');
  const sign = crypto.createSign('RSA-SHA256');
  sign.update(unsortedString);
  return sign.sign(privateKey, 'base64');
}

其中,params是待签名的参数,privateKey是私钥。具体步骤如下:

  1. 按照参数名字母升序排序;
  2. 将所有参数名和参数值串在一起;
  3. 按照上述签名方式生成签名。

1.2. 验签

验签是在接收到支付宝返回的数据后,验证数据的真实性的一种方式。在NodeJs中,使用以下代码可进行验签:

const crypto = require('crypto');

function verifySign(params, publicKey) {
  const sign = params.sign;
  const signType = params.sign_type;
  delete params.sign;
  const unsortedString = Object.keys(params).sort().map(key => {
    return key + '=' + params[key];
  }).join('&');
  const verify = crypto.createVerify(`RSA-${signType}`);
  verify.update(unsortedString);
  return verify.verify(publicKey, sign, 'base64');
}

其中,params是支付宝返回的所有参数,publicKey是公钥。具体步骤如下:

  1. 将待验签参数中的sign参数和sign_type参数值剔除;
  2. 将所有参数名和参数值串在一起;
  3. 按照上述验签方式验证签名。

2. 示例说明

2.1. 示例一:签名

假设有如下待签名的参数:

const params = {
  app_id: '2018060600000000',
  method: 'alipay.trade.page.pay',
  format: 'JSON',
  charset: 'utf-8',
  sign_type: 'RSA2',
  timestamp: '2018-06-06 15:45:57',
  version: '1.0',
  notify_url: 'http://www.baidu.com',
  return_url: 'https://qr-test.antfin.com/home/uniqId/123',
  biz_content: '{"out_trade_no":"20150320010101001","product_code":"FAST_INSTANT_TRADE_PAY","total_amount":88.88,"subject":"Iphone6 16G"}'
};

其中,私钥为:

MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCbZoq0txOE8ppd9fzRh/LanK+sDO0M8s5GZeT95sX2QiLGxTtS13Jm

使用上述的getSign方法可生成如下签名:

ee4yMmbLNfXVorXsL7tarlWHtHtliFiPQyFzM0qySv+0TJ8tKBjlP3LAsyFGpJyKHKnCJbYBxq4GVEAKnoSvBXu8i5bB+35N8xR9ZrC

2.2. 示例二:验签

假设支付宝返回的参数如下:

const params = {
  "gmt_create": "2015-04-01 10:55:55",
  "charset": "utf-8",
  "seller_email": "test@alipay.com",
  "subject": "大乐透2等奖",
  "sign": "ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE",
  "buyer_id": "2088101117955611",
  "invoice_amount": "20.00",
  "notify_id": "ac05099524730693a8b330c5ecf72da9786",
  "fund_bill_list": "[{\"amount\":\"10.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]",
  "notify_type": "trade_status_sync",
  "trade_status": "TRADE_SUCCESS",
  "receipt_amount": "15.00",
  "app_id": "2018020102122555",
  "buyer_pay_amount": "15.00",
  "sign_type": "RSA2",
  "seller_id": "2088102116777220",
  "gmt_payment": "2015-04-01 10:54:45",
  "notify_time": "2015-04-01 10:56:59",
  "version": "1.0",
  "out_trade_no": "6823789339978248",
  "total_amount": "20.00",
  "trade_no": "20150320010101001"
};

其中,公钥为:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWFoF1XtzWXuYXKPBHpkJLYMs/IgZVd4mvZ/YSC0atxoWTD7aXK+xvc2i9UG0kZ

使用上述的verifySign方法可验证签名是否合法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解NodeJs支付宝移动支付签名及验签 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)

    下面我将为您详细讲解“JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)”的完整攻略。 简述 在现代 Web 开发中,为了实现可编辑的富文本区域,往往采用了 iframe + document.designMode 的方式。但在使用 iframe+document.designMode方案时,如何让光标到达指定位置并插入内容,是一个…

    node js 2023年6月8日
    00
  • node.js中的fs.writeSync方法使用说明

    Node.js中的fs.writeSync方法使用说明 什么是fs.writeSync方法 fs.writeSync方法是Node.js中的一个文件操作方法,其作用是同步地向指定文件中写入数据。与fs.write方法不同的是,fs.writeSync方法是阻塞式的,因此会阻塞程序的运行直到写入操作完成。 其语法如下: fs.writeSync(fd, dat…

    node js 2023年6月8日
    00
  • node实现mock-plugin中间件的方法

    Node.js是一个可以运行JavaScript的开发平台,可以用它来实现服务器端的编程,也可以使用它来开发命令行工具。Mock-plugin中间件是一个常用的Web前端开发工具,可以提供本地开发时的Mock数据服务,Webpack、Gulp、Grunt、Browserify等开源工具可以通过在构建阶段注入插件的方式实现Mock功能。 以下是实现Node实现…

    node js 2023年6月8日
    00
  • javascript 进阶篇2 CSS XML学习

    Javascript 进阶篇2 CSS XML 学习攻略 1. 学习 CSS CSS(Cascading Style Sheets)是一种用于描述网页布局和样式的语言。在学习 CSS 之前,先要了解 HTML 的基础知识,因为 CSS 主要是用来修饰 HTML 的。 以下是学习 CSS 的步骤: 学习 CSS 的基本语法 selector { propert…

    node js 2023年6月8日
    00
  • node.js正则表达式获取网页中所有链接的代码实例

    实现获取网页中所有链接的功能,可以使用Node.js正则表达式进行匹配。以下是实现的完整攻略: 获取网页内容 首先,我们需要使用Node.js的HTTP模块获取要匹配的网页的内容。可以使用以下代码实现: const http = require(‘http’); const url = ‘http://example.com’; http.get(url, …

    node js 2023年6月8日
    00
  • nodejs发送http请求时遇到404长时间未响应的解决方法

    关于“nodejs发送http请求时遇到404长时间未响应的解决方法”的完整攻略,我可以提供以下几点建议和示例说明: 问题背景 在使用 Node.js 发送 HTTP 请求时,可能会遇到服务器返回 404 状态码时,请求会长时间未响应的问题。这种情况通常发生在使用第三方库(如 axios、request 等)发起请求时。假如我们使用 axios 库来发送请求…

    node js 2023年6月8日
    00
  • Windows系统下nodejs、npm、express的下载和安装教程详解

    Windows系统下nodejs、npm、express的下载和安装教程详解 安装node.js 1.访问node.js官网,下载Windows版本的node.js .msi安装文件。 2.安装node.js,一路点击Next直到安装完成。 3.打开命令行工具,输入以下代码,输出node -v和npm -v版本信息,即为node.js的安装成功。 node …

    node js 2023年6月8日
    00
  • node实现封装一个图片拼接插件

    下面给出详细的步骤说明。 1. 安装依赖 由于本项目需要使用到图片处理和文件操作相关的模块,因此需要先安装相应的依赖包,包括jimp和fs,其中jimp用来实现图片的处理功能,fs用来实现文件操作的功能 npm install jimp –save 2. 创建项目工程 创建一个空目录用于存储该项目文件,并在该目录下初始化一个node工程: mkdir im…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部