遭遇淘宝的Invalid Signature错误

最近有朋友在用淘宝的API做东西,开发完成从沙箱迁移去正式环境,相同的代码得到错误提示Invalid Signature。

去open.taobao.com翻了一下文档,有一篇签名的生成规则,恩,淘宝制定了一套规范来生成signature,也就是http请求中sign参数的值。

规范本身很简单,只是很难书面描述清楚,给个例子,假设http请求是:http://gw.api.taobao.com/router/rest?app_key=1234567&product=name,price,id&method=product.search&sign_method=md5&v=2.0

需要做以下事情来生成signature:

1。把http的所有参数,也就是http://gw.api.taobao.com/router/rest?后面的东西,拷下来作为一个string,然后去掉所有的"&"和"=",得到字串:app_key1234567productname,price,idmethodproduct.searchsign_methodmd5v2.0

2。把淘宝给你的app secret加在字串的前、后,假设secret是“taobao_app_secret”,那么得到字串就是:

taobao_app_secretapp_key1234567productname,price,idmethodproduct.searchsign_methodmd5v2.0taobao_app_secret

3。对刚才得到的字串做md5,得到摘要,就是signature,假设得到abcdef。然后需要在http请求后加一个&sign=abcdef

朋友试过N次,仍然得到Invalid signature,看了看程序,md5结果应该是对的。仔细对照淘宝api工具生成的请求,发现一个陷阱。淘宝服务器收到请求后,会做一个校验,也就是把刚才生成signature的过程做一边,如果得到的signature与你上传的sign参数的值不同,就会得到一个invalid signature错误。而这里的陷阱在于,淘宝服务器会先对http参数做一个排序,如果你本地的排序与淘宝不同,那么signature当然不会对。

利用淘宝的api测试工具可以很容易的看到它的排序:

例如某个api的顺序就是这样滴:

app_key=1234567

format=xml

method=taobao.shopcats.list.get

sign_method=md5

timestamp=2010-06-22 11:04:15

v=2.0

sign=AD64DFFCBB86FF3839E6468BB490B404


照着它的顺序做了调整,done.

然则。。。为毛在测试环境没发现这个问题捏??试了一把,淘宝沙箱里面,signature怎么写都没关系,测试服务器不会校验这个。不专业呀。。。。


猜你喜欢

转载自yuanxing.iteye.com/blog/696252