2012-05-28 52 views
1

下面的代碼導致SignatureDoesNotMatch錯誤,並沒有在他們的論壇或支持有太多的運氣 - 關於下面的代碼有什麼問題的任何建議?SignatureDoesNotMatch錯誤使用亞馬遜網絡服務

<?php 
error_reporting(E_ALL); 
ini_set("display_errors", 1); 
$AWS_ACCESS_KEY_ID = ""; 
$AWS_SECRET_ACCESS_KEY = ""; 

$base_url = "http://ecs.amazonaws.com/onca/xml?"; 
$url_params = array('Operation'=>"ItemSearch",'Service'=>"AWSECommerceService", 
'AWSAccessKeyId'=>$AWS_ACCESS_KEY_ID,'AssociateTag'=>"", 
'Version'=>"2011-08-01",'Availability'=>"Available",'Condition'=>"All", 
'ItemPage'=>"1",'ResponseGroup'=>"Images,ItemAttributes,EditorialReview", 
'Keywords'=>"Amazon"); 

// Add the Timestamp 
$url_params['Timestamp'] = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()); 

// Sort the URL parameters 
$url_parts = array(); 
foreach(array_keys($url_params) as $key) 
    $url_parts[] = $key."=".$url_params[$key]; 
sort($url_parts); 

// Construct the string to sign 
$string_to_sign = "GET\necs.amazonaws.com\n/onca/xml\n".implode("&",$url_parts); 
$string_to_sign = str_replace('+','%20',$string_to_sign); 
$string_to_sign = str_replace(':','%3A',$string_to_sign); 
$string_to_sign = str_replace(';',urlencode(';'),$string_to_sign); 

// 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 = base64_encode($signature); 
$signature = str_replace('+','%2B',$signature); 
$signature = str_replace('=','%3D',$signature); 
$signature = str_replace(';',urlencode(';'),$signature); 
$url_string = implode("&",$url_parts); 
$url = $base_url.$url_string."&Signature=".$signature; 
print $url; 

$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); 

$xml_response = curl_exec($ch); 
echo $xml_response; 
    ?> 

回答

11

我得到類似的錯誤消息:

["Code"]=> string(21) "SignatureDoesNotMatch" 
    ["Message"]=> string(100) "Signature expired: 20130528T162908Z is now earlier than 20130528T162916Z (20130528T163416Z - 5 min.)" 

檢查我的服務器時鐘之後,我發現它的時候是不正確的,並同步我的服務器時鐘sudo ntpdate ntp.ubuntu.com後,我能夠發送電子郵件與沒問題,我希望這個幫助。

+0

這纔剛剛救了我的生命。所有用戶都無法註冊,因爲他們沒有收到激活電子郵件... =(任何想法爲什麼會發生這種情況?(幾個小時前,它完美地工作,沒有在服務器上做任何改變) –