2010-07-13 18 views
0

J'essaie d'intégrer Amazon Product API dans mon site Web et est tombé sur plusieurs articles qui m'ont aidé à construire l'URL. Le seul problème est quand j'exécute le code ci-dessous je reçois l'erreur suivante. Est-ce que je fais quelque chose de mal?Amazon Product API avec PHP

Internal Server Error Le serveur a rencontré une erreur interne ou et misconfiguration n'a pas pu compléter votre demande. S'il vous plaît contacter l'administrateur du serveur, [email protected] et les informer de le moment où l'erreur s'est produite, et tout ce que vous pourriez avoir fait qui peut ont causé l'erreur. Plus informations sur cette erreur peut être disponible dans le journal des erreurs du serveur.

$AWS_ACCESS_KEY_ID = "[myaccesskeyhere]"; 
$AWS_SECRET_ACCESS_KEY = "[mysecretkeyhere]"; 

$base_url = "http://ecs.amazonaws.com/onca/xml?"; 
$url_params = array('Operation'=>"ItemSearch",'Service'=>"AWSECommerceService", 
'AWSAccessKeyId'=>$AWS_ACCESS_KEY_ID,'AssociateTag'=>"yourtag-10", 
'Version'=>"2006-09-11",'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); 

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

EDIT

LE CODE CI-DESSUS fonctionne maintenant ... je manquais un "?" après l'URL de BASE

Répondre

4
$AWS_ACCESS_KEY_ID = "[myaccesskeyhere]"; 
$AWS_SECRET_ACCESS_KEY = "[mysecretkeyhere]"; 

$base_url = "http://ecs.amazonaws.com/onca/xml?"; 
$url_params = array('Operation'=>"ItemSearch",'Service'=>"AWSECommerceService", 
'AWSAccessKeyId'=>$AWS_ACCESS_KEY_ID,'AssociateTag'=>"yourtag-10", 
'Version'=>"2006-09-11",'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); 

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

Pour tous ceux qui se demandaient. Vous pouvez ensuite naviguer dans la xml_response en utilisant simplexml!

Hope this helps quelqu'un là :)

+0

Je teste avec cela, mais il est dit La signature de la demande, nous avons calculé ne correspond pas à la signature que vous avez fournie. Vérifiez votre clé d'accès secrète AWS et la méthode de signature. Consultez la documentation de service pour plus de détails. bien que mes tests clés sur cette URL fonctionnent bien. http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html Une aide s'il vous plaît? – Daroath

-1

Utilisez le code Bellow pour l'API produit Amazon:

<?php 
//Enter your IDs 
define("Access_Key_ID", "[Your Access Key ID]"); 
define("Associate_tag", "[Your Associate Tag ID]"); 

//Set up the operation in the request 
function ItemSearch($SearchIndex, $Keywords){ 

//Set the values for some of the parameters 
$Operation = "ItemSearch"; 
$Version = "2013-08-01"; 
$ResponseGroup = "ItemAttributes,Offers"; 
//User interface provides values 
//for $SearchIndex and $Keywords 

//Define the request 
$request= 
    "http://webservices.amazon.com/onca/xml" 
    . "?Service=AWSECommerceService" 
    . "&AssociateTag=" . Associate_tag 
    . "&AWSAccessKeyId=" . Access_Key_ID 
    . "&Operation=" . $Operation 
    . "&Version=" . $Version 
    . "&SearchIndex=" . $SearchIndex 
    . "&Keywords=" . $Keywords 
    . "&Signature=" . [Request Signature] 
    . "&ResponseGroup=" . $ResponseGroup; 

//Catch the response in the $response object 
$response = file_get_contents($request); 
$parsed_xml = simplexml_load_string($response); 
printSearchResults($parsed_xml, $SearchIndex); 
} 
?>