通过阅读本篇文章,你可以了解到数字签名技术,了解支付宝接口的签名和验签的流程

签名

某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将 “签名字符串 sign” 作为通知参数发送给商户系统。支付宝签名的步骤是:

  1. 拼接 “待签名字符串”;
  2. 调用签名方法 sign();
  3. 拼接完整的请求 URL。

技术是为了解决问题而生的,进行数字签名的目的是:

  • 确保信息是由签名者发送的。防止有人冒充支付宝向商户系统发送异步通知;
  • 确保信息自签名后 到 收到为止,信息未被修改过。防止有人篡改请求参数的值。

如果商家设置的通知地址为 https://api.xx.com/receive_notify.htm,对应收到的通知示例如下:

https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00&notify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8&notify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838&notify_id=4a91b7a78a503640467525113fb7d8bg8e

1 、拼接 “待签名字符串”

支付宝对要发送的通知参数进行签名的第一步是:拼接 “待签名字符串”。

  1. 对需要签名的参数进行字典排序:字典排序是按照参数的第一个字符的 ASCII 码递增排序(字母升序排序)。如果参数的第一个字符相同,则按照参数的第二个字符的 ASCII 码递增排序,以此类推。
  2. 对排序后的参数进行拼接,得到 “待签名字符串”:将排序后的参数与其对应值,组合成参数=参数值的格式,参数与参数之间用 & 字符连接起来,此时生成的字符串为 “待签名字符串”。

2、调用签名方法 sign()

支付宝对要发送的通知参数进行签名的第二步是:调用签名算法对应的签名方法 sign(),生成签名字符串 sign。

调用签名算法对应的签名方法时,需要提供以下几个参数:待签名字符串 content、字符编码方案 charset(UTF-8、GBK)和 签名者的私钥 privateKey。签名方法 sign() 的处理逻辑如下:

  1. 对 “待签名字符串” 进行编码,得到字节数组:使用指定的字符编码方案,将 “待签名字符串” 编码为字节数组(byte 类型的数组)
  2. 进行签名、Base64 编码,得到签名字符串 sign:使用签名者的私钥 privateKey 对 “待签名字符串” 对应的字节数组进行签名,并对签名结果进行 Base64 编码,以便在网络上传输。经过 Base64 编码后的字符串即为 “签名字符串 sign”。String sign = new String(Base64.encodeBase64(signed));

3、拼接完整的请求 URL

支付宝对要发送的通知参数进行签名的第三步是:拼接完整的请求 URL。

  1. 拼接 sign 参数:将生成的签名字符串作为 sign 参数的 value 拼接到请求数据中。
  2. Encode 请求数据:对所有一级 key 的 value 值进行 UrlEncode 编码。
  3. 拼接完整的请求 URL:将编码后的请求数据发送至商户系统指定的 URL。

验签

验签的全称是:验证指定内容的签名是否正确。

商户系统收到支付宝发送的异步通知后,商户系统需要对支付宝发送的通知参数进行验签处理。商户系统验签的步骤是:

  1. 拼接 “待验签字符串”;
  2. 获取签名字符串 sign;
  3. 调用验签方法 verify(),获得验签结果。

1、拼接 “待验签字符串”

对支付宝发送的通知参数进行验签的第一步是:拼接 “待验签字符串”。

  1. 获取签名的参数:在通知返回的参数列表中,除去 sign、sign_type 两个参数外,凡是通知返回的参数都是签名的参数。
  2. 对签名的参数进行 UrlDecode 解码
  3. 对签名的参数进行字典排序:字典排序是按照参数的第一个字符的 ASCII 码递增排序(字母升序排序)。如果参数的第一个字符相同,则按照参数的第二个字符的 ASCII 码递增排序,以此类推。
  4. 对排序后的参数进行拼接,得到 “待验签字符串”:将排序后的参数与其对应值,组合成参数=参数值的格式,参数与参数之间用 & 字符连接起来,此时生成的字符串为 “待验签字符串”。
body=大乐透2.1&buyer_id=2088102116773037&charset=utf-8&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&notify_time=2016-07-19 14:10:49&notify_type=trade_status_sync&out_trade_no=0719141034-6418&refund_fee=0.00&subject=大乐透2.1&total_amount=2.00&trade_no=2016071921001003030200089909&trade_status=TRADE_SUCCESS&version=1.0

2、取出签名字符串 sign

对支付宝发送的通知参数进行验签的第二步是:从通知返回的参数列表中,取出签名字符串 sign。

3、调用验签方法 verify()

对支付宝发送的通知参数进行验签的第三步是:调用签名算法对应的验签方法 verify(),根据验签方法 verify() 的返回结果判定是否验签通过。


调用签名算法对应的验签方法时,需要提供以下几个参数:待验签字符串 content、字符编码方案 charset、签名字符串 sign 和 签名者的公钥 publicKey。验签方法 verify() 的处理逻辑如下:

  1. 对 “待验签字符串” 进行编码,得到字节数组:使用指定的字符编码方案,将 “待验签符串” 编码为字节数组(byte 类型的数组)
  2. 对 “签名字符串 sign” 进行 Base64 解码,得到字节数组:得到的这个字节数组即为当时签名之后的初始字节数组(密文)。
  3. 使用公钥验证签名boolean varifyResult = boosignature.verify(Base64.decodeBase64(sign.getBytes()))
    1. 使用签名者的公钥 publicKey 对 密文 进行 解密,得到 “支付宝通知的摘要”;
    2. 对 “待验签符串” 对应的字节数组做摘要,得到摘要结果;
    3. 将 “商户计算出的摘要结果” 和 “解密得到的摘要” 作比较:如果二者相同,则说明验签成功;否则说明验签失败。

验签成功后,商户系统根据通知参数进行业务处理。

参考资料

自行实现签名 - 支付宝文档中心 (alipay.com)

自行实现验签 - 支付宝文档中心 (alipay.com)

支付宝接口的数字签名相关推荐

  1. 支付接口教程,详解支付宝接口(二)

    支付宝的接口向来集成过程都让人觉得比较舒服,只有APP支付相对复杂,但也只是配置上复杂一些,只要清楚原理相信也不是什么难事.下面是以前介绍双钥加密原理的传送门: 支付接口教程特别篇,公钥与私钥,双钥加 ...

  2. 支付宝 php rsa算法,:PHP支付宝接口RSA验证

    这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...

  3. 支付宝接口使用文档说明 支付宝异步通知

    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类.  A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式  B页面跳 ...

  4. TP 框架实现支付宝接口功能

    最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能.这里我用的是即时到帐的接口,具体实现的步骤如下: 一.下载支付宝接口包 下载地址: https://doc.open.alip ...

  5. 第四百零三节,python网站在线支付,支付宝接口集成与远程调试,

    第四百零三节,python网站在线支付,支付宝接口集成与远程调试, windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS ...

  6. 调用支付宝接口android最新,Android 外接sdk之支付宝

    支付宝开放平台 最新sdk可以访问开放平台进行下载. 以下为流程和注意事项. 1.名词简介 请求    手机客户端以字符串形式把需要传输的数据发送给接收方的过程. 返回     支付宝以字符串形式直接 ...

  7. PHP支付宝接口RSA验证

    这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...

  8. 最详细支付宝接口申请、使用!!!带详细流程--实践--支付宝当面付申请

    前言: 今天是看到同学,申请了一波支付宝当面付,而且成功了,现在已经可以应用到项目中,就是手续费有点高(0.6%)100块要上交6毛.但是对比起其他的第三方服务,还是便宜了不少.而且这个是唯一一个能够 ...

  9. Android之应用程序如何调用支付宝接口

    http://blog.csdn.net/lilidejing/article/details/19483717 最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比 ...

最新文章

  1. BIG DATA 大数据时代来临
  2. 20个!中国科协发布2020年重大科学问题和工程技术难题
  3. Java中用StreamTokenizer与Scanner读取数据
  4. F5 network
  5. python如何进入文件夹_python之文件的读写和文件目录以及文件夹的操作实现代码...
  6. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
  7. windows中 修改某种文件图标 的方法 (备忘)
  8. <meta name=“robots“ content=“index,follow“>的解释
  9. T4生成实体和简单的CRUD操作
  10. 如何给数组赋值java_java怎样给数组赋值
  11. 男孩子初中毕业学计算机技术,男孩子初中毕业学什么技术好就业
  12. arm linux 优化
  13. CISCO寄存器配置与说明
  14. 学术会议论文查重吗_会议论文集算不算期刊
  15. KVM虚拟化进阶--KVM设备高级管理
  16. 大数据时代BI平台何去何从
  17. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结【转载】
  18. 国企的面试我们应该怎么准备?
  19. 中国蚁剑(antSword)加载不出来!
  20. 背包问题(01背包和完全背包)

热门文章

  1. 3DMax更改视口布局和最大化快捷键(二)
  2. javascript中toFixed()方法详解
  3. Maven配置仓库地址
  4. 【技术分享】猪八戒网DevOps之Java组件安全检测
  5. 软件自动化测试的特点和流程
  6. oracle rman 登录方式,oracle rman登陆及连接target数据库的步骤方法
  7. android 6.0 名字,棉花糖Marshmallow 是Android 6.0的名字
  8. windows一键安装Javaweb项目
  9. PDF导出-复杂样式【像搭积木一样排版】
  10. leetcode:715. Range 模块【无脑segmentTree】