示例 | 参数名 | 参数值 |
<response> <order> <result_code>ILLEGAL_ARGUMENT</result_code> <result_message>非法参数</result_message> </order> </response> |
result_code | ILLEGAL_ARGUMENT |
result_message | 非法参数 |
对于如下参数数组
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¬ify_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的私钥是以英文字母和数字组成的32位字符串。商户可登录到商户服务中心(https://b.alipay.com),安装数字证书,在“技术服务”栏目中点击“交易安全校验码”,即可查看。
在RSA签名时,需要私钥和公钥一起参与签名。私钥与公钥皆是客户通过OPENSSL来生成得出的。客户把生成出的公钥与支付宝技术人员配置好的支付宝公钥做交换。因此,在签名时,客户要用到的是客户的私钥及支付宝的公钥。