亚马逊MWS产品SignatureDoesNotMatch

时间:2014-07-24 20:00:47

标签: amazon-mws

当我运行此代码时,我收到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();

5 个答案:

答案 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所说,很难弄清楚出了什么问题。

以下是我犯的错误:

  1. 我使用http://docs.developer.amazonservices.com/en_US/dev_guide/DG_SigningQueryRequest.html中的示例代码来签署我的请求。要小心,因为它的默认网址实际上是mws.amazonservices.com/,但我应该mws.amazonservices.com/Orders/2013-09-01。
  2. 我的私钥中有一个斜杠,因此当我使用双击选择它时,它只选择斜杠前面的部分。当您尝试复制/粘贴密钥时,请确保选择整个字符串。

答案 4 :(得分:0)

我也收到了SignatureDoesNotMatch错误,对我来说,事实证明我是对URL查询字符串参数进行双重编码。