2011-10-21 99 views
5

我使用的是亚马逊的API,并同时更新我的​​股票从我的数据库到亚马逊网站出现此错误:SignatureDoesNotMatch亚马逊API

Caught Exception: Internal Error 
Response Status Code: 0 
Error Code: 
Error Type: 
Request ID: 
XML: 

我读这个线程(amazonsellercommunity COM /论坛/ thread.jspa? MESSAGEID = 2194823),然后得到错误的解释:

<Error><Type>Sender</Type><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message><Detail/></Error> 

所以我想我的MARKETPLACE_ID,MERCHANT_ID,AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY可能是错的。但我检查了这些信息是正确的。

其实,我不明白为什么会发生这个错误......之前,它完美的工作,并且因为几天它就崩溃了。而且我没有改变我的代码中的任何东西。奇怪,不是吗?

编辑:

这是我的签名部分代码。

define ('DATE_FORMAT', 'Y-m-d\TH:i:s\Z'); 
define('AWS_ACCESS_KEY_ID', 'ABC...'); // My AWS Access Key Id (20 characters) 
define('AWS_SECRET_ACCESS_KEY', 'ABCDEF...'); // My AWS Secret Access Key (40 characters) 
define('APPLICATION_NAME', 'MyCompany_AmazonMWS'); 
define('APPLICATION_VERSION', '0.0.1'); 
define ('MERCHANT_ID', 'XXXXXXX'); // My Merchant ID 
define ('MARKETPLACE_ID', 'XXXXXXX'); // My Marketplace ID 

$config = array (
'ServiceURL' => "https://mws.amazonservices.fr", 
'ProxyHost' => null, 
'ProxyPort' => -1, 
'MaxErrorRetry' => 3, 
); 

$service = new MarketplaceWebService_Client(
AWS_ACCESS_KEY_ID, 
AWS_SECRET_ACCESS_KEY, 
$config, 
APPLICATION_NAME, 
APPLICATION_VERSION 
); 

$parameters = array (
'Marketplace' => MARKETPLACE_ID, 
'Merchant' => MERCHANT_ID, 
'FeedType' => '_POST_INVENTORY_AVAILABILITY_DATA_', 
'FeedContent' => $feedHandle, 
'PurgeAndReplace' => false, 
'ContentMd5' => base64_encode(md5(stream_get_contents($feedHandle), true)), 
); 

// and then I do this: 

$request = new MarketplaceWebService_Model_SubmitFeedRequest($parameters); 
invokeSubmitFeed($service, $request); 

如果您想查看我的代码的某些部分,只需询问。

预先感谢您。

+0

请某人能帮助我吗? – Octelio

+0

用亚马逊Scratchpad试试这个.https://mws.amazonservices.de/scratchpad/index.html –

+0

我使用的是暂存器,仍然会出现同样的错误。我已经多次重新键入密钥,复制并粘贴,但即使是暂存器报告中签名不匹配,也不知道接下来要尝试的内容。 – Jeff

回答

2

如果我没有记错,Amazon API的身份验证机制对您的计算机上的当前日期/时间敏感(用于签署请求的过程中)。检查您的日期/时间是否设置正确。

+1

请注意,不同的服务具有不同的时间容差。对于SQS,容差很低,而S3有几分钟的容忍度。只需在你的盒子上运行chronyd(不是NTPD,它不能很好地处理虚拟机)。 – BraveNewCurrency

1

对我来说,这只是我的网络应用程序传递url转义字符串的错误。特殊字符不像亚马逊,这个(不是很有用)的错误出现了。确保你的文件名没有url转义字符。

0

我解决了它(在Ubuntu 14.04服务器)使用ntpdate

首先确保它安装:

apt-get install ntpdate 

然后执行:

ntpdate ntp.ubuntu.com 
+1

你能解释为什么这会解决提问者的问题吗? – polka

+0

运行此代码的计算机上的系统时间与Amazon的服务器之间的时钟偏差可能足以使Amazon拒绝该请求,因为它认为该请求太旧。 尽管如此,您仍会收到一条消息。 “请求已过期”的结果。或类似的。我已经看到了,但我不记得确切的措辞。 – clintm