2014-07-09 95 views
4

我使用亞馬遜MWS爲了API(ListOrders),我可以成功地在亞馬遜便籤運行它,但我收到以下錯誤亞馬遜MWS訂單API時間戳必須遵循ISO8601

發件人
MalformedInput
時間戳必須按照ISO8601

下面是PHP腳本這是我從一些了#1張貼

$base_url = "https://mws.amazonservices.com/Orders/2013-09-01"; 
$method = "POST"; 
$host = "mws.amazonservices.com"; 
$uri = "/Orders/2013-09-01"; 

$params = array(
    'AWSAccessKeyId' => "AWSAccessKeyId", 
    'Action' => "ListOrders", 
    'SellerId' => "SellerId", 
    'SignatureMethod' => "HmacSHA256", 
    'SignatureVersion' => "2", 
    //'Timestamp'=> gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()), 
    'Timestamp'=> gmdate("Y-m-d\TH:i:s\Z", time()), 
    'Version'=> "2013-09-01", 
    'MarketplaceId' => "MarketplaceId", 
    'CreatedAfter'=>'2014-07-06T19%3A00%3A00Z', 
    'CreatedBefore'=>'2014-07-08T19%3A00%3A00Z' 
    ); 

// Sort the URL parameters 
$url_parts = array(); 
foreach(array_keys($params) as $key) 
    $url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key])); 

sort($url_parts); 

// Construct the string to sign 
$url_string = implode("&", $url_parts); 
$string_to_sign = "GET\nmws.amazonservices.com\n/Orders/2013-09-01\n" . $url_string; 

// Sign the request 
$signature = hash_hmac("sha256", $string_to_sign, AWS_SECRET_ACCESS_KEY, TRUE); 

// Base64 encode the signature and make it URL safe 
$signature = urlencode(base64_encode($signature)); 

$url = "https://mws.amazonservices.com/Orders/2013-09-01" . '?' . $url_string . "&Signature=" . $signature; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
$response = curl_exec($ch); 

$parsed_xml = simplexml_load_string($response); 
print '<pre>'; 
print_r($response); 

任何人都可以幫助找到我的錯誤嗎?

回答

4

您發送3個日期值:

'Timestamp'=> gmdate("Y-m-d\TH:i:s\Z", time()), 
'CreatedAfter'=>'2014-07-06T19%3A00%3A00Z', 
'CreatedBefore'=>'2014-07-08T19%3A00%3A00Z' 

一開始,你可以得到,因爲默認反正擺脫的第二個參數來gmdate()time()。除此之外,這很好,不應該是你的問題的原因。

其他兩個參數具有網址編碼字符(冒號編碼爲%3A),然後通過rawurlencode()發送一次以再次編碼。這將用%25替換上面提到的百分號。 CreatedAfter實際發送給亞馬遜的CreatedAfter因此是2014-07-06T19%253A00%253A00Z。試試這個:

'Timestamp'=> gmdate("Y-m-d\TH:i:s\Z"), 
'CreatedAfter'=>'2014-07-06T19:00:00Z', 
'CreatedBefore'=>'2014-07-08T19:00:00Z' 
+0

感謝@Hazzit CreatedAfter和CreatedBefore做了這個訣竅。 –

+0

還有一件事我必須將MarketplaceId更改爲MarketplaceId.Id.1,否則它給了我錯誤**意外的列表元素終止** –

0

我也通過以下格式「:MM:YYYY-MM-dd'T'hh ss'Z'」發送時間戳曾與Java API的。我固定我的相同問題。