PHP: reperire informazioni su un prodotto di Amazon

PHP: reperire informazioni su un prodotto di Amazon

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

Torna su