Reperire informazioni su un prodotto di Amazon è un'operazione che richiede due passaggi distinti.
Iscrizione
Per prima cosa dovete avere un account AWS per ottenere le access key (pubblica e segreta, ossia privata). A questo punto dovete iscrivervi alle Product Advertising API per ottenere il vostro ID di associato (affiliate).
Implementazione
I dati fondamentali sono l'ID del prodotto e la regione su cui effettuare la richiesta. L'ID (ASIN) è una stringa univoca alfanumerica di 10 caratteri che identifica il prodotto. Possiamo quindi implementare la seguente classe:
class Amazon
{
public $asin;
public $region;
private $_accesskey = 'Access key pubblica AWS';
private $_secretKey = 'Secret key AWS';
private $_tag = 'ID affiliate';
public function __construct($id, $region)
{
$this->asin = $id;
$this->region = $region;
}
public function getProduct()
{
$xml = $this->_createRequest(array(
'Operation' => 'ItemLookup',
'ItemId' => $this->asin,
'IncludeReviewsSummary' => false,
'ResponseGroup' => 'Medium,OfferSummary'
));
$item = $xml->Items->Item;
$title = htmlentities((string) $item->ItemAttributes->Title);
$url = htmlentities((string) $item->DetailPageURL);
$image = htmlentities((string) $item->MediumImage->URL);
$price = htmlentities((string) $item->OfferSummary->LowestNewPrice->Amount);
$code = htmlentities((string) $item->OfferSummary->LowestNewPrice->CurrencyCode);
$qty = htmlentities((string) $item->OfferSummary->TotalNew);
if ($qty !== '0') {
$response = array(
'code' => $code,
'price' => number_format((float) ($price / 100), 2, '.', ''),
'image' => $image,
'url' => $url,
'title' => $title
);
}
return $response;
}
protected function _getPage($url)
{
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$html = curl_exec($curl);
curl_close($curl);
return $html;
}
protected function _createRequest($params)
{
$publicKey = $this->_accesskey;
$privateKey = $this->_secretKey;
$method = 'GET';
$host = 'ecs.amazonaws.' . $this->region;
$host = 'webservices.amazon.' . $this->region;
$uri = '/onca/xml';
$params['Service'] = 'AWSECommerceService';
$params['AssociateTag'] = $this->_tag;
$params['AWSAccessKeyId'] = $publicKey;
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
$params['Version'] = '2011-08-01';
ksort($params);
$canonicalizedQuery = array();
foreach ($params as $param => $value) {
$param = str_replace('%7E', '~', rawurlencode($param));
$value = str_replace('%7E', '~', rawurlencode($value));
$canonicalizedQuery[] = $param . '=' . $value;
}
$canonicalizedQuery = implode('&', $canonicalizedQuery);
$stringToSign = $method . "\n" . $host . "\n" . $uri . "\n" . $canonicalizedQuery;
$signature = base64_encode(hash_hmac('sha256', $stringToSign, $privateKey, true));
$signature = str_replace('%7E', '~', rawurlencode($signature));
$request = 'http://' . $host . $uri . '?' . $canonicalizedQuery . '&Signature=' . $signature;
$response = $this->_getPage($request);
$pxml = @simplexml_load_string($response);
if ($pxml === false) {
return false;
} else {
return $pxml;
}
}
}
Esempio d'uso:
$myAmazon = new Amazon('B0000YCFCW', 'com');
print_r($myAmazon->getProduct());