Alipay, China's leading third-party online payment solutionAlipay, China's leading third-party online payment solution

签名机制

生成待签名的字符串

需要参与签名的参数

在请求参数列表中,除去sign、sign_type两个参数外,其他需要使用到的参数皆是要签名的参数。(个别接口中参数sign_type也需要参与签名。) 

在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是要签名的参数。

生成待签名字符串

对于如下的参数数组:

copy
key-----------------------value
total_fee-----------------0.01
trade_information---------{"business_type":"4","goods_info":"Macbook 12 inch M3 8G 256G SSD^1|Apple iPad Pro 11 inch^1","total_quantity":"2"}
_input_charset------------UTF-8
appenv--------------------system=android^version=3.0.1.2
body----------------------test
currency------------------USD
forex_biz-----------------FP
out_trade_no--------------out_trade_no_20200109_175417
partner-------------------2088021017666931
payment_type--------------1
product_code--------------NEW_WAP_OVERSEAS_SELLER
seller_id-----------------2088021017666931
service-------------------mobile.securitypay.pay
subject-------------------Mika's coffee shop

对数组里的每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推。 

排序完成之后,再把所有数组值以key="value"和“&”字符连接起来,如:

_input_charset="UTF-8"&appenv="system=android^version=3.0.1.2"&body="test"&currency="USD"&forex_biz="FP"&out_trade_no="out_trade_no_20200109_175417"&partner="2088021017666931"&payment_type="1"&product_code="NEW_WAP_OVERSEAS_SELLER"&seller_id="2088021017666931"&service="mobile.securitypay.pay"&subject="Mika's coffee shop"&total_fee="0.01"&trade_information="{"business_type":"4","goods_info":"Macbook 12 inch M3 8G 256G SSD^1|Apple iPad Pro 11 inch^1","total_quantity":"2"}"

这串字符串便是待签名字符串。

 Note:

  • 没有值的参数无需传递,也无需包含到待签名数据中;
  • 签名时将字符转化成字节流时指定的字符集与_input_charset保持一致;
  • 如果传递了_input_charset参数,这个参数也应该包含在待签名数据中;
  • 根据HTTP协议要求,传递参数的值中如果存在特殊字符(如:&、@等),那么该值需要做URL Encoding,这样请求接收方才能接收到正确的参数值。这种情况下,待签名数据应该是原生值而不是encoding之后的值。例如:调用某接口需要对请求参数email进行数字签名,那么待签名数据应该是email=test@msn.com,而不是email=test%40msn.com。

签名

RSA签名

在RSA的签名时,需要私钥和公钥一起参与签名。私钥与公钥皆是客户通过OPENSSL来生成得出的。客户把生成出的公钥与支付宝技术人员配置好的支付宝公钥做交换。因此,在签名时,客户要用到的是客户的私钥及支付宝的公钥。

  • 请求时签名

当拿到请求时的待签名字符串后,把待签名字符串与客户的私钥一同放入RSA的签名函数中进行签名运算,从而得到签名结果字符串。

  • 通知返回时验证签名

当获得到通知返回时的待签名字符串后,把待签名字符串、支付宝提供的公钥、支付宝通知返回参数中的参数sign的值三者一同放入RSA的签名函数中进行非对称的签名运算,来判断签名是否验证通过。