Amazon Product Advertising API

Neste post vamos ver como trabalhar com a API de produtos Amazon. A Amazon mudou em 2009 o mecanismo de autenticação para acessar sua API, que deve agora ser assinado com as suas chaves da Amazon. Os pedidos que não forem assinados serão rejeitadas pela Amazon.

Por | @jonathanlamimkt Programação

A Amazon mudou em 2009 o mecanismo de autenticação para acessar sua API, que deve agora ser assinado com as suas chaves da Amazon. Os pedidos que não forem assinados serão rejeitadas pela Amazon. Observe que o código utiliza a função hash hash_hmac() que só está disponível para as versões 5.1.2 e superiores, não funcionando para versões anteriores.

Um exemplo


Veja abaixo um exemplo simples utilizando a classe AmazonProductAPI.

searchProducts("X-Men Origins",
                                       AmazonProductAPI::DVD,
                                       "TITLE");
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
    }
 
    print_r($result);
?>


A classe de acesso a API



Veja a implementação da classe de acesso da Amazon Product Advertising API. Os comentários foram removidos por motivos de concisão, mas estão incluídos no download do código fonte. Note que apenas algumas operações de acesso foram implementadas na classe: ItemLookup, ItemSearch. Existem mais disponível na API, uma lista completa pode ser encontrada aqui.

Items->Item->ItemAttributes->Title))
            {
                return ($response);
            }
            else
            {
                throw new Exception("Invalid xml response.");
            }
        }
    }
 
    private function queryAmazon($parameters)
    {
        return aws_signed_request("com",
                                  $parameters,
                                  $this->public_key,
                                  $this->private_key);
    }
 
    public function searchProducts($search,$category,$searchType="UPC")
    {
        $allowedTypes = array("UPC", "TITLE", "ARTIST", "KEYWORD");
        $allowedCategories = array("Music", "DVD", "VideoGames");
 
        switch($searchType) 
        {
            case "UPC" :
                $parameters = array("Operation"     => "ItemLookup",
                                    "ItemId"        => $search,
                                    "SearchIndex"   => $category,
                                    "IdType"        => "UPC",
                                    "ResponseGroup" => "Medium");
                            break;
 
            case "TITLE" :
                $parameters = array("Operation"     => "ItemSearch",
                                    "Title"         => $search,
                                    "SearchIndex"   => $category,
                                    "ResponseGroup" => "Medium");
                            break;
 
        }
 
        $xml_response = $this->queryAmazon($parameters);
 
        return $this->verifyXmlResponse($xml_response);
 
    }
 
    public function getItemByUpc($upc_code, $product_type)
    {
        $parameters = array("Operation"     => "ItemLookup",
                            "ItemId"        => $upc_code,
                            "SearchIndex"   => $product_type,
                            "IdType"        => "UPC",
                            "ResponseGroup" => "Medium");
 
        $xml_response = $this->queryAmazon($parameters);
 
        return $this->verifyXmlResponse($xml_response);
 
    }
 
    public function getItemByAsin($asin_code)
    {
        $parameters = array("Operation"     => "ItemLookup",
                            "ItemId"        => $asin_code,
                            "ResponseGroup" => "Medium");
 
        $xml_response = $this->queryAmazon($parameters);
 
        return $this->verifyXmlResponse($xml_response);
    }
 
    public function getItemByKeyword($keyword, $product_type)
    {
        $parameters = array("Operation"   => "ItemSearch",
                            "Keywords"    => $keyword,
                            "SearchIndex" => $product_type);
 
        $xml_response = $this->queryAmazon($parameters);
 
        return $this->verifyXmlResponse($xml_response);
    }
 
}
?>


A assinatura da requisição


A classe acima usa o 'aws_signed_request' função para gerar a assinatura de um novo pedido. O código original é de Ulrich Mierendorff, modificado aqui para usar o cURL.

$value)
    {
        $param = str_replace("~", "~", rawurlencode($param));
        $value = str_replace("~", "~", rawurlencode($value));
        $canonicalized_query[] = $param."=".$value;
    }
 
    $canonicalized_query = implode("&", $canonicalized_query);
 
    $string_to_sign = $method."n".$host."n".$uri."n".
                            $canonicalized_query;
 
    /* calcula a assinatura usando HMAC, SHA256 e base64-encoding */
    $signature = base64_encode(hash_hmac("sha256", 
                                  $string_to_sign, $private_key, True));
 
    /* codifica a assinatura da requisição */
    $signature = str_replace("~", "~", rawurlencode($signature));
 
    /* cria a requisição */
    $request = "http://".$host.$uri."?".$canonicalized_query."
                &Signature=".$signature;
 
    /* Eu prefiro usar cURL */
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$request);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 
    $xml_response = curl_exec($ch);
 
    if ($xml_response === False)
    {
        return False;
    }
    else
    {        
        $parsed_xml = @simplexml_load_string($xml_response);
        return ($parsed_xml === False) ? False : $parsed_xml;
    }
}
?>


Espero que tenham gostado de mais uma API. Não se esqueçam de fazer o download dos arquivos para poderem testar.
Até a próxima!!!

Mais sobre: php amazon api
Share Tweet
Recomendado
Comentários
Carregar comentários
Destaquesver tudo
  • ASSINE NOSSA NEWSLETTER

    As melhores publicações no
    seu e-mail

  • Preencha para confirmar