支付宝接口的数字签名
通过阅读本篇文章,你可以了解到数字签名技术,了解支付宝接口的签名和验签的流程
签名
某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将 “签名字符串 sign” 作为通知参数发送给商户系统。支付宝签名的步骤是:
- 拼接 “待签名字符串”;
- 调用签名方法 sign();
- 拼接完整的请求 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¬ify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8¬ify_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¬ify_id=4a91b7a78a503640467525113fb7d8bg8e
1 、拼接 “待签名字符串”
支付宝对要发送的通知参数进行签名的第一步是:拼接 “待签名字符串”。
- 对需要签名的参数进行字典排序:字典排序是按照参数的第一个字符的 ASCII 码递增排序(字母升序排序)。如果参数的第一个字符相同,则按照参数的第二个字符的 ASCII 码递增排序,以此类推。
- 对排序后的参数进行拼接,得到 “待签名字符串”:将排序后的参数与其对应值,组合成
参数=参数值
的格式,参数与参数之间用 & 字符连接起来,此时生成的字符串为 “待签名字符串”。
2、调用签名方法 sign()
支付宝对要发送的通知参数进行签名的第二步是:调用签名算法对应的签名方法 sign(),生成签名字符串 sign。
调用签名算法对应的签名方法时,需要提供以下几个参数:待签名字符串 content、字符编码方案 charset(UTF-8、GBK)和 签名者的私钥 privateKey。签名方法 sign() 的处理逻辑如下:
- 对 “待签名字符串” 进行编码,得到字节数组:使用指定的字符编码方案,将 “待签名字符串” 编码为字节数组(byte 类型的数组)
- 进行签名、Base64 编码,得到签名字符串 sign:使用签名者的私钥 privateKey 对 “待签名字符串” 对应的字节数组进行签名,并对签名结果进行 Base64 编码,以便在网络上传输。经过 Base64 编码后的字符串即为 “签名字符串 sign”。
String sign = new String(Base64.encodeBase64(signed));
3、拼接完整的请求 URL
支付宝对要发送的通知参数进行签名的第三步是:拼接完整的请求 URL。
- 拼接 sign 参数:将生成的签名字符串作为 sign 参数的 value 拼接到请求数据中。
- Encode 请求数据:对所有一级 key 的 value 值进行 UrlEncode 编码。
- 拼接完整的请求 URL:将编码后的请求数据发送至商户系统指定的 URL。
验签
验签的全称是:验证指定内容的签名是否正确。
商户系统收到支付宝发送的异步通知后,商户系统需要对支付宝发送的通知参数进行验签处理。商户系统验签的步骤是:
- 拼接 “待验签字符串”;
- 获取签名字符串 sign;
- 调用验签方法 verify(),获得验签结果。
1、拼接 “待验签字符串”
对支付宝发送的通知参数进行验签的第一步是:拼接 “待验签字符串”。
- 获取签名的参数:在通知返回的参数列表中,除去 sign、sign_type 两个参数外,凡是通知返回的参数都是签名的参数。
- 对签名的参数进行 UrlDecode 解码
- 对签名的参数进行字典排序:字典排序是按照参数的第一个字符的 ASCII 码递增排序(字母升序排序)。如果参数的第一个字符相同,则按照参数的第二个字符的 ASCII 码递增排序,以此类推。
- 对排序后的参数进行拼接,得到 “待验签字符串”:将排序后的参数与其对应值,组合成
参数=参数值
的格式,参数与参数之间用 & 字符连接起来,此时生成的字符串为 “待验签字符串”。
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¬ify_time=2016-07-19 14:10:49¬ify_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() 的处理逻辑如下:
- 对 “待验签字符串” 进行编码,得到字节数组:使用指定的字符编码方案,将 “待验签符串” 编码为字节数组(byte 类型的数组)
- 对 “签名字符串 sign” 进行 Base64 解码,得到字节数组:得到的这个字节数组即为当时签名之后的初始字节数组(密文)。
- 使用公钥验证签名:
boolean varifyResult = boosignature.verify(Base64.decodeBase64(sign.getBytes()))
- 使用签名者的公钥 publicKey 对 密文 进行 解密,得到 “支付宝通知的摘要”;
- 对 “待验签符串” 对应的字节数组做摘要,得到摘要结果;
- 将 “商户计算出的摘要结果” 和 “解密得到的摘要” 作比较:如果二者相同,则说明验签成功;否则说明验签失败。
验签成功后,商户系统根据通知参数进行业务处理。
参考资料
自行实现签名 - 支付宝文档中心 (alipay.com)
自行实现验签 - 支付宝文档中心 (alipay.com)
支付宝接口的数字签名相关推荐
- 支付接口教程,详解支付宝接口(二)
支付宝的接口向来集成过程都让人觉得比较舒服,只有APP支付相对复杂,但也只是配置上复杂一些,只要清楚原理相信也不是什么难事.下面是以前介绍双钥加密原理的传送门: 支付接口教程特别篇,公钥与私钥,双钥加 ...
- 支付宝 php rsa算法,:PHP支付宝接口RSA验证
这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...
- 支付宝接口使用文档说明 支付宝异步通知
支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类. A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式 B页面跳 ...
- TP 框架实现支付宝接口功能
最近做系统,需要实现在线支付功能,毫不犹豫,选择的是支付宝的接口支付功能.这里我用的是即时到帐的接口,具体实现的步骤如下: 一.下载支付宝接口包 下载地址: https://doc.open.alip ...
- 第四百零三节,python网站在线支付,支付宝接口集成与远程调试,
第四百零三节,python网站在线支付,支付宝接口集成与远程调试, windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C:\WINDOWS ...
- 调用支付宝接口android最新,Android 外接sdk之支付宝
支付宝开放平台 最新sdk可以访问开放平台进行下载. 以下为流程和注意事项. 1.名词简介 请求 手机客户端以字符串形式把需要传输的数据发送给接收方的过程. 返回 支付宝以字符串形式直接 ...
- PHP支付宝接口RSA验证
这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SDK,P ...
- 最详细支付宝接口申请、使用!!!带详细流程--实践--支付宝当面付申请
前言: 今天是看到同学,申请了一波支付宝当面付,而且成功了,现在已经可以应用到项目中,就是手续费有点高(0.6%)100块要上交6毛.但是对比起其他的第三方服务,还是便宜了不少.而且这个是唯一一个能够 ...
- Android之应用程序如何调用支付宝接口
http://blog.csdn.net/lilidejing/article/details/19483717 最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比 ...
最新文章
- BIG DATA 大数据时代来临
- 20个!中国科协发布2020年重大科学问题和工程技术难题
- Java中用StreamTokenizer与Scanner读取数据
- F5 network
- python如何进入文件夹_python之文件的读写和文件目录以及文件夹的操作实现代码...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
- windows中 修改某种文件图标 的方法 (备忘)
- <meta name=“robots“ content=“index,follow“>的解释
- T4生成实体和简单的CRUD操作
- 如何给数组赋值java_java怎样给数组赋值
- 男孩子初中毕业学计算机技术,男孩子初中毕业学什么技术好就业
- arm linux 优化
- CISCO寄存器配置与说明
- 学术会议论文查重吗_会议论文集算不算期刊
- KVM虚拟化进阶--KVM设备高级管理
- 大数据时代BI平台何去何从
- AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结【转载】
- 国企的面试我们应该怎么准备?
- 中国蚁剑(antSword)加载不出来!
- 背包问题(01背包和完全背包)
热门文章
- 3DMax更改视口布局和最大化快捷键(二)
- javascript中toFixed()方法详解
- Maven配置仓库地址
- 【技术分享】猪八戒网DevOps之Java组件安全检测
- 软件自动化测试的特点和流程
- oracle rman 登录方式,oracle rman登陆及连接target数据库的步骤方法
- android 6.0 名字,棉花糖Marshmallow 是Android 6.0的名字
- windows一键安装Javaweb项目
- PDF导出-复杂样式【像搭积木一样排版】
- leetcode:715. Range 模块【无脑segmentTree】