当试图在Amazon API上列出产品时,SignatureDoesNotMatch


SignatureDoesNotMatch when attempting to list a product on Amazon API

不知是否有人能帮忙。

我想通过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);

有人能帮忙吗?

在传递参数到这里之前,你必须先对它们进行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

同时,Amazon期望SellerId操作_POST_PRODUCT_DATA_,而不是Merchant

我建议你使用mws-eu-amazonservices.com而不是co.uk,你可以在所有欧洲市场使用这个,不需要为每个市场更改它。作为旁注:

Amazon没有真正报告正确的错误。如果只有SellerId像上面一样是Merchant,或者与你想做的事情无关的任何不同的东西,你也会出现错误。

相关文章:
  • 没有找到相关文章