当我运行此代码时,我收到SignatureDoesNotMatch错误。我没有找到问题。我甚至注释掉sort()以使数组保持自然顺序。任何帮助将不胜感激。
$params = array(
'AWSAccessKeyId' => "*********",
'Action' => "GetCompetitivePricingForASIN",
'SellerId' => "********",
'SignatureVersion' => "2",
'Timestamp' => gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()),
'Version' => "2011-10-01",
'SignatureMethod' => "HmacSHA256",
'MarketplaceId' => "ATVPDKIKX0DER",
'AsinList.ASIN.1' => $asin
);
$url_parts = array();
foreach (array_keys($params) as $key)
$url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key]));
//sort($url_parts);
$url_string = implode("&", $url_parts);
$string_to_sign = "GET\nmws.amazonservices.com\n/Products/2011-10-01\n" . $url_string;
$signature = hash_hmac("sha256", $string_to_sign, AWS_SECRET_ACCESS_KEY, TRUE);
$signature = urlencode(base64_encode($signature));
$url = "https://mws.amazonservices.com/Orders/2011-10-01" . '?' . $url_string . "&Signature=" . $signature;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$response = curl_exec($ch);
$xml = simplexml_load_string($response);
echo $xml->asXML();
答案 0 :(得分:4)
签名不匹配是一个非常常见的错误,并且难以找出确切的错误!!我个人的建议是将请求与亚马逊暂存器请求进行比较。这对我来说总是有帮助的。并且params必须按字母顺序排列,以便匹配签名。 在此处尝试您的API请求:https://mws.amazonservices.in/scratchpad/index.html 然后单击请求详细信息选项卡以查看完整请求URL,签名,md5哈希等。
答案 1 :(得分:2)
这花了我几个小时,我希望这可以帮助任何人遇到SignatureDoesNotMatch错误的简单但不太明显的原因。
当调用所需的方法是POST时,请务必在生成的签名字符串和curl选项中指定该方法:
curl_setopt($ch, CURLOPT_POST, 1);
答案 2 :(得分:1)
好吧,花了我2天才意识到这一点
$string_to_sign = "GET\nmws.amazonservices.com\n/Products/2011-10-01\n"
和
$url = "https://mws.amazonservices.com/Orders/2011-10-01" . '?' . $url_string
只是不会一起工作。产品和订单并不完全相同。谢谢大家的帮助。新秀在这里犯了错误。
答案 3 :(得分:1)
整个下午我都想弄清楚如何让它发挥作用。正如@Bck所说,很难弄清楚出了什么问题。
以下是我犯的错误:
答案 4 :(得分:0)
我也收到了SignatureDoesNotMatch错误,对我来说,事实证明我是对URL查询字符串参数进行双重编码。