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

yizhihongxing

下面是详解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日

相关文章

  • coffeescript使用的方式汇总

    Coffeescript使用的方式汇总 Coffeescript是一种将CoffeeScript代码编译成JavaScript代码的语言。它通过简化JavaScript代码来提高开发人员的生产力,具有简洁、可读、可维护的特点。本文将介绍Coffeescript的使用方式。 安装Coffeescript 要使用Coffeescript,首先需要安装它。在命令行…

    node js 2023年6月8日
    00
  • zTree 树插件实现全国五级地区点击后加载的示例

    下面我来详细讲解一下“zTree 树插件实现全国五级地区点击后加载的示例”的完整攻略。 1. 安装 zTree 插件 要实现该示例,首先需要安装 zTree 插件。可以在 zTree 的官网上下载最新的版本,也可以直接引用在线的CDN资源。这里我以引用在线CDN资源的方式来进行示例说明。 <!– 引入 zTree 树插件的 css 文件 –>…

    node js 2023年6月8日
    00
  • Nodejs多站点切换Htpps协议详解及简单实例

    关于”Nodejs多站点切换Htpps协议详解及简单实例” 的攻略,我将按照以下内容来进行讲解: 什么是HTTP和HTTPS协议 Nodejs多站点切换HTTPS协议的实现方法 示例说明 1. 什么是HTTP和HTTPS协议 HTTP(HyperText Transfer Protocol,超文本传输协议) 和 HTTPS (HTTP Secure)协议是在…

    node js 2023年6月8日
    00
  • golang执行命令操作 exec.Command

    关于golang中执行命令操作exec.Command的攻略,我可以提供以下的详细讲解。 1. 执行命令 首先,我们需要导入Go的os/exec包。然后,就可以使用Command函数执行命令。它接受一个字符串参数,这个字符串包含了要执行的命令及其参数。 package main import ( "fmt" "os/exec&q…

    node js 2023年6月8日
    00
  • JS中如何优雅的使用async await详解

    下面是JS中如何优雅的使用async/await的详细攻略。 异步编程的不足 JavaScript是一门事件驱动(event-driven)和非阻塞(non-blocking)的编程语言。因为这个特性,它非常适合在浏览器和服务器端应用程序中进行异步编程。然而,异步编程往往会导致代码复杂、难以维护和调试,在回调地狱(callback hell)中陷入困境。 为…

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

    来讲一讲“node.js中的fs.appendFileSync方法使用说明”的完整攻略。 什么是fs.appendFileSync方法 在Node.js中,我们可以使用fs模块来进行文件读写操作,其中fs.appendFileSync方法就是用来在文件末尾追加内容的方法。它的基本语法如下: fs.appendFileSync(file, data[, opt…

    node js 2023年6月8日
    00
  • 详解express + mock让前后台并行开发

    让我来详细讲解一下”详解express + mock让前后台并行开发”的完整攻略。 概述 前后端分离已经成为现代web开发的重要方式,前后端并行开发加快了开发效率。其中,利用mock数据代替后端接口对于前端开发人员是非常有利的。Express是一个流行的Node.js web框架,可以方便的搭建Web应用程序。下面我们将详细介绍如何使用Express + m…

    node js 2023年6月8日
    00
  • 利用Node.js了解与测量HTTP所花费的时间详解

    我会详细讲解“利用Node.js了解与测量HTTP所花费的时间详解”的完整攻略。这个攻略可以帮助你了解HTTP请求到响应所需要的时间,从而优化网站的性能。 1. 概述 HTTP请求的时间可以分为三个步骤:DNS解析、TCP连接和HTTP请求/响应时间。在Node.js中,我们可以使用内置的http模块来测量这三个步骤的时间。 2. 测量DNS解析时间 在浏览…

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