文档中心 > 花呗预授权

签名机制

更新时间:2016/05/19 访问次数:4876

生成待签名的字符串

1. 需要参与签名的参数

  • 在请求参数列表中,除去sign、sign_type两个参数外,其他需要使用到的参数皆是要签名的参数。(个别接口中参数sign_type也需要参与签名。)
  • 在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是要签名的参数。
  • 在XML返回参数列表中,一个节点作为一个参数,节点名代表参数名,节点值代表参数值。
    正常返回的情况下,需要签名的参数是节点 的子节点 下的所有子节点。
    发生错误的情况下,需要签名的参数只有 节点。
    如果参数值中出现HTML转义字符,那么需要将这些转义字符调整成正常的字符,如:“<”代表的就是“<”。
    举例如下
示例 参数名 参数值

<response>

  <order>

    <result_code>ILLEGAL_ARGUMENT</result_code>

    <result_message>非法参数</result_message>

  </order>

</response>

result_code ILLEGAL_ARGUMENT
result_message 非法参数

2. 生成待签名字符串

对于如下参数数组

string[] parameters={
    "service=alipay.fund.auth.create.voucher",
    "partner=2088001159940003",
    "_input_charset=GBK",
    "notify_url=http://www.test.com/alipay/notify_url.php",
    "out_order_no=20140216001",
    "out_request_no=20140216001001",
    "product_code=BUY_FOR_FREE",
    "scene_code=BUY_IPHONE_FOR_FREE",
    "order_title=0元购土豪金",
    "amount=4800.00"
};

对数组里的每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推。排序完成之后,再把所有数组值以“&”字符连接起来,如:

_input_charset=GBK&amount=4800.00&notify_url=http://www.test.com/alipay/notify_url.php&order_title=0元购土豪金&out_order_no=20140216001&out_request_no=20140216001001&partner=2088001159940003&product_code=BUY_FOR_FREE&scene_code=BUY_IPHONE_FOR_FREE&service=alipay.fund.auth.create.voucher

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

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

签名

MD5签名

在MD5签名时,需要私钥参与签名。MD5的私钥是以英文字母和数字组成的32位字符串。商户可登录到商户服务中心(https://b.alipay.com),安装数字证书,在“技术服务”栏目中点击“交易安全校验码”,即可查看。

  • 请求时签名
    当拿到请求时的待签名字符串后,需要把私钥直接拼接到待签名字符串后面,形成新的字符串,利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串(该字符串赋值于参数sign)。
  • 通知返回时验证签名
    当获得到通知返回时的待签名字符串后,同理,需要把私钥直接拼接到待签名字符串后面,形成新的字符串,利用MD5的签名函数对这个新的字符串进行签名运算,从而得到32位签名结果字符串。此时这个新的字符串需要与支付宝通知返回参数中的参数sign的值进行验证是否相等,来判断签名是否验证通过。

RSA签名

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

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

FAQ

关于此文档暂时还没有FAQ
返回
顶部