支付宝接口的数字签名

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

签名

某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将 “签名字符串 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)

相关文章
|
5月前
|
算法 安全 数据安全/隐私保护
支付系统-微信支付10--数字证书,我Doug谎称自己手中公钥是Bob的公钥 ,谁都可以发送公钥,怎样判断公钥是真实的呢?Doug就可以用自己私钥做成数字签名给pat,而Pat用假的公钥进行验签,数字
支付系统-微信支付10--数字证书,我Doug谎称自己手中公钥是Bob的公钥 ,谁都可以发送公钥,怎样判断公钥是真实的呢?Doug就可以用自己私钥做成数字签名给pat,而Pat用假的公钥进行验签,数字
|
5月前
|
安全 数据安全/隐私保护
支付系统之微信支付08-身份认证,公钥和私钥的含义,私钥自己有的,作为唯一的控制系统,私钥加密,公钥解密是为了身份认证
支付系统之微信支付08-身份认证,公钥和私钥的含义,私钥自己有的,作为唯一的控制系统,私钥加密,公钥解密是为了身份认证
|
5月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
5月前
|
API
支付系统----微信支付24--APlv3介绍,首先我们要引入支付参数,包含商户号,APPID、API秘钥,数字证书,用代码加载到应用程序当中,之后加载商户私钥,商户需要用私钥进行验签,微信平台接收商
支付系统----微信支付24--APlv3介绍,首先我们要引入支付参数,包含商户号,APPID、API秘钥,数字证书,用代码加载到应用程序当中,之后加载商户私钥,商户需要用私钥进行验签,微信平台接收商
|
7月前
|
安全 小程序 Java
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
java实现微信服务(公众)号用户关注时,获取openid,安全模式下的加密解密实现
|
7月前
|
前端开发 API 数据安全/隐私保护
API接口签名验证
过去对于接口的验证我一般都是直接在登录时为用户发放token,用户在随后的操作中携带了token则允许请求。 但是这样的验证方式存在有一定的问题,如果token被泄露被他人获取,那么就会有非法请求的风险。其他人可以使用这个token自行调用接口进行请求,传入非法参数甚至进行注入攻击等,可能会造成严重的问题。
|
算法 安全 数据安全/隐私保护
信息加密
通过阅读本篇文章,你可以了解到对称加密、非对称加密、组合加密。
197 0
信息加密
技术汇总:第十七章:支付宝对接公钥,私钥
技术汇总:第十七章:支付宝对接公钥,私钥
123 0
技术汇总:第十七章:支付宝对接公钥,私钥
|
开发工具
教程-使用支付宝公钥验签
阅读角色:技术同学 技术同学把1).APPID,2).应用私钥,3).支付宝公钥,配置在代码中,对请求内容进行签名,并对支付宝返回的内容进行验签。 支付宝开放平台SDK封装了签名和验签过程,只需配置账号及密钥参数即可,强烈建议使用。
1556 0
|
算法
支付宝支付配置公私钥
支付宝支付配置公私钥
362 0