【问题标题】:SignatureDoesNotMatch when attempting to list a product on Amazon API尝试在 Amazon API 上列出产品时的 SignatureDoesNotMatch
【发布时间】:2015-08-10 06:54:02
【问题描述】:

我想知道是否有人可以提供帮助。

我正在尝试通过 API 在亚马逊上发布产品。

当使用 GetOrders 时,它可以完美运行,但除了参数之外的代码相似,我在使用 SubmitFeed _POST_PRODUCT_DATA_ 时收到以下错误消息

“Sender SignatureDoesNotMatch 我们计算的请求签名与您提供的签名不匹配。请检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。”

我的所有详细信息都是正确的,密钥、aws 访问密钥等,并且我已将用于登录我的代码的字符串与在 Amazon API 测试工具中生成的字符串进行了比较,它们完全相同,所以我不知道是什么问题。

这是我正在使用的代码 -

$timestamp = date('c', strtotime($todays_date_time));
$timestamp = gmdate('Y-m-d\TH:i:s\Z', strtotime($timestamp));

$params = array(
    'AWSAccessKeyId' => "MY_AWS_KEY",
    'Action' => "SubmitFeed",
    'Merchant' => "MY_SELLER_ID",
    'FeedType' => "_POST_PRODUCT_DATA_",
    'SignatureMethod' => "HmacSHA256",
    'SignatureVersion' => "2",
    'Timestamp'=> $timestamp,
    'Version'=> "2009-01-01",
    'MarketplaceIdList.Id.1' => "MY_MARKETPLACE_ID",
    'PurgeAndReplace'=>'false'
);

$secret = 'MY_SECRET_KEY';

$url_parts = array();

foreach(array_keys($params) as $key) {

    $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key]));

}

然后我在这里创建 XML 并将其存储在变量 $amazon_feed 中,然后 -

sort($url_parts);

$url_string = implode("&", $url_parts);
$string_to_sign = "POST\nmws.amazonservices.co.uk\n/\n" . $url_string;

$signature = hash_hmac("sha256", $string_to_sign, $secret, TRUE);

$http_header     =   array();
$http_header[]   =   'Transfer-Encoding: chunked';
$http_header[]   =   'Content-Type: application/xml';
$http_header[]   =   'Content-MD5: ' . base64_encode(md5($amazon_feed, true));
$http_header[]   =   'Expect:';
$http_header[]   =   'Accept:';

$signature = urlencode(base64_encode($signature));

$link = "https://mws.amazonservices.co.uk/Feeds/2009-01-01?".$url_string."&Signature=".$signature;

$ch = curl_init($link);
curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $amazon_feed); 
$response = curl_exec($ch);

print_r($response);

$info = curl_getinfo($ch);
curl_close($ch);

有人可以帮忙吗?

【问题讨论】:

标签: php amazon-web-services


【解决方案1】:

您必须先ksort() 您的参数,然后才能将它们传递到此处:

foreach(array_keys($params) as $key) {

    $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key]));

}

例如

$params = array(
    'AWSAccessKeyId' => "MY_AWS_KEY",
    'Action' => "SubmitFeed",
    'SellerId' => "MY_SELLER_ID",
    'FeedType' => "_POST_PRODUCT_DATA_",
    'SignatureMethod' => "HmacSHA256",
    'SignatureVersion' => "2",
    'Timestamp'=> $timestamp,
    'Version'=> "2009-01-01",
    'MarketplaceIdList.Id.1' => "MY_MARKETPLACE_ID",
    'PurgeAndReplace'=>'false'
);

$secret = 'MY_SECRET_KEY';
$url_parts = array();
ksort($params);
foreach(array_keys($params) as $key) {

    $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key]));

}

我不完全确定你要签名的字符串,你应该试试这个(添加 /Feeds/2009-01-01 到它):

"POST\nmws-eu.amazonservices.com\n/Feeds/2009-01-01\n" . $url_string

此外,亚马逊希望 SellerId 用于 _POST_PRODUCT_DATA_ 操作,而不是 Merchant

我建议您使用 mws-eu-amazonservices.com 而不是 co.uk,您可以将其用于所有欧洲市场,而无需为每个市场进行更改。 作为旁注:

亚马逊并没有真正报告正确的错误。如果只有 SellerId 是上面的 Merchant,或者与您尝试做的事情无关的任何不同的东西,也可能会发生您遇到的错误。

【讨论】:

  • 感谢您的回复迈克尔。我曾尝试使用 ksort 并出现相同的错误。我放置商家的原因是因为在测试工具中传递的是 url 而不是 SellerId 但我现在尝试使用 SellerId 并出现相同的错误。我理解你的旁注,但似乎找不到我遗漏的内容。
  • 您是否也尝试了最后一次编辑?您签名的字符串不完整
  • 我最初没有刷新页面,只是现在尝试了一下,谢谢它现在可以工作了。更改您给我的 POST 行,并将发送到 mws-eu 的 url 工作。
  • 嗨迈克尔,很抱歉再次询问,但出于好奇,由于提要返回成功但该产品不在我的库存中,亚马逊上显示商品需要多长时间?
  • 谢谢迈克尔,我检查了 GetFeedSubmissionResult,但我没有包含条件,所以它抛出了一个错误。感谢您的所有帮助!
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多