Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尝试在Amazon API上列出产品时SignatureDesNotMatch_Php_Amazon Web Services - Fatal编程技术网

Php 尝试在Amazon API上列出产品时SignatureDesNotMatch

Php 尝试在Amazon API上列出产品时SignatureDesNotMatch,php,amazon-web-services,Php,Amazon Web Services,我想知道是否有人能帮忙 我试图通过API在Amazon上列出一个产品 当使用GetOrders时,它可以完美地工作,但是除了参数之外,它的代码类似。当使用SubmitFeed\u POST\u PRODUCT\u数据时,我会收到以下错误消息_ “发件人签名与我们计算的请求签名不匹配与您提供的签名不匹配。请检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。” 我所有的细节都是正确的,密钥、aws访问密钥等。我已经将登录代码的字符串与Amazon API测试工具中生成的字符串进行了

我想知道是否有人能帮忙

我试图通过API在Amazon上列出一个产品

当使用GetOrders时,它可以完美地工作,但是除了参数之外,它的代码类似。当使用SubmitFeed\u POST\u PRODUCT\u数据时,我会收到以下错误消息_

“发件人签名与我们计算的请求签名不匹配与您提供的签名不匹配。请检查您的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\u 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]));

}
e、 g

我不完全确定您要签名的字符串,您应该尝试使用以下内容(添加/Feeds/2009-01-01):

此外,亚马逊希望
\u POST\u PRODUCT\u DATA\u操作使用
SellerId
,而不是
商家

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


亚马逊并没有真正报告正确的错误。如果只有SellerId是上面提到的Merchant,或者与您尝试做的事情无关的任何其他内容,那么您也可能会出现错误

不久前我就遇到了这个问题。看看这个问题(和答案),看看它是否对你有帮助:谢谢你的回答。我尝试过使用ksort,但出现了相同的错误。我之所以选择merchant,是因为在测试工具中,url中传递的不是SellerId,而是SellerId,但我现在使用SellerId尝试了相同的错误。我理解你的旁注,但似乎找不到我遗漏的内容。你也试过上次编辑吗?您正在签名的字符串不完整我最初没有刷新页面,但现在尝试了一下,谢谢,现在可以使用了。更改您给我的帖子行和发送到mws eu one的url有效。嗨,Michael,很抱歉再次询问,但出于好奇,在亚马逊上显示该列表之前多久,因为提要返回成功但产品不在我的库存中?谢谢Michael,我检查了GetFeedSubmissionResult,但我没有包含该条件,因此它抛出了一个错误。谢谢你的帮助!
$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]));

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