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

      签名机制

      #生成待签名的字符串

      #需要参与签名的参数

      在请求参数列表中,除去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的签名函数中进行非对称的签名运算,来判断签名是否验证通过。