2016-10-02 9 views
1

こんにちは私は私のアプリからアマゾンからアイテムを見ることができるように私のモバイルアプリケーションにAPIを統合しようとしている初心者プログラマーです。私はすべての6つの簡単なステップhereに従ったが、例は私のためには役に立たなかった、hereのように。製品広告API PHP無効なxml応答

ここ

は私のアマゾンのPHPコードです:

<?php 

    require_once 'aws_signed_request.php'; 

    class AmazonProductAPI 
    { 
     /** 
     * Your Amazon Access Key Id 
     * @access private 
     * @var string 
     */ 
     private $public_key  = "AKIAJETPMOLIUXXXXXXX"; 

     /** 
     * Your Amazon Secret Access Key 
     * @access private 
     * @var string 
     */ 
     private $private_key = "eHpNEaUwsf+HXXXXXXXXXXQGg7Ic2w+K5Gb6rYa"; 

     /** 
     * Your Amazon Associate Tag 
     * Now required, effective from 25th Oct. 2011 
     * @access private 
     * @var string 
     */ 
     private $associate_tag = "mpXXXX-20"; 

     /** 
     * Constants for product types 
     * @access public 
     * @var string 
     */ 

     /* 
      Only three categories are listed here. 
      More categories can be found here: 
      http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/APPNDX_SearchIndexValues.html 
     */ 
     const MUSIC = "Music"; 
     const DVD = "DVD"; 
     const GAMES = "VideoGames"; 


     /** 
     * Check if the xml received from Amazon is valid 
     * 
     * @param mixed $response xml response to check 
     * @return bool false if the xml is invalid 
     * @return mixed the xml response if it is valid 
     * @return exception if we could not connect to Amazon 
     */ 
     private function verifyXmlResponse($response) 
     { 
      if ($response === False) 
      { 
       throw new Exception("Could not connect to Amazon"); 
      } 
      else 
      { 
       if (isset($response->Items->Item->ItemAttributes->Title)) 
       { 
        return ($response); 
       } 
       else 
       { 
        throw new Exception("Invalid xml response."); 
       } 
      } 
     } 


     /** 
     * Query Amazon with the issued parameters 
     * 
     * @param array $parameters parameters to query around 
     * @return simpleXmlObject xml query response 
     */ 
     private function queryAmazon($parameters) 
     { 
      return aws_signed_request("com", $parameters, $this->public_key, $this->private_key, $this->associate_tag); 
     } 


     /** 
     * Return details of products searched by various types 
     * 
     * @param string $search search term 
     * @param string $category search category   
     * @param string $searchType type of search 
     * @return mixed simpleXML object 
     */ 
     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); 

     } 


     /** 
     * Return details of a product searched by UPC 
     * 
     * @param int $upc_code UPC code of the product to search 
     * @param string $product_type type of the product 
     * @return mixed simpleXML object 
     */ 
     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); 

     } 


     /** 
     * Return details of a product searched by ASIN 
     * 
     * @param int $asin_code ASIN code of the product to search 
     * @return mixed simpleXML object 
     */ 
     public function getItemByAsin($asin_code) 
     { 
      $parameters = array("Operation"  => "ItemLookup", 
           "ItemId"  => $asin_code, 
           "ResponseGroup" => "Medium"); 

      $xml_response = $this->queryAmazon($parameters); 

      return $this->verifyXmlResponse($xml_response); 
     } 


     /** 
     * Return details of a product searched by keyword 
     * 
     * @param string $keyword keyword to search 
     * @param string $product_type type of the product 
     * @return mixed simpleXML object 
     */ 
     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); 
     } 

    } 

?> 

amazon_api_class.php
aws_signed_request.php

<?php 

function aws_signed_request($region,$params,$public_key,$private_key,$associate_tag) 
{ 

    $method = "GET"; 
    $host = "ecs.amazonaws.".$region; // must be in small case 
    $uri = "/onca/xml"; 


    $params["Service"]   = "AWSECommerceService"; 
    $params["AWSAccessKeyId"] = $public_key; 
    $params["AssociateTag"]  = $associate_tag; 
    $params["Timestamp"]  = gmdate("Y-m-d\TH:i:s\Z"); 
    $params["Version"]   = "2009-03-31"; 

    /* The params need to be sorted by the key, as Amazon does this at 
     their end and then generates the hash of the same. If the params 
     are not in order then the generated hash will be different thus 
     failing the authetication process. 
    */ 
    ksort($params); 

    $canonicalized_query = array(); 

    foreach ($params as $param=>$value) 
    { 
     $param = str_replace("%7E", "~", rawurlencode($param)); 
     $value = str_replace("%7E", "~", rawurlencode($value)); 
     $canonicalized_query[] = $param."=".$value; 
    } 

    $canonicalized_query = implode("&", $canonicalized_query); 

    $string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query; 

    /* calculate the signature using HMAC with SHA256 and base64-encoding. 
     The 'hash_hmac' function is only available from PHP 5 >= 5.1.2. 
    */ 
    $signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, True)); 

    /* encode the signature for the request */ 
    $signature = str_replace("%7E", "~", rawurlencode($signature)); 

    /* create request */ 
    $request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature; 

    /* I prefer using 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 cURL doesn't work for you, then use the 'file_get_contents' 
     function as given below. 
    */ 

    if ($xml_response === False) 
    { 
     return False; 
    } 
    else 
    { 
     /* parse XML */ 
     $parsed_xml = @simplexml_load_string($xml_response); 
     return ($parsed_xml === False) ? False : $parsed_xml; 
    } 
} 
?> 

Example.php

<?php 

    /* Example usage of the Amazon Product Advertising API */ 
    include("amazon_api_class.php"); 

    $obj = new AmazonProductAPI(); 

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

    print_r($result); 


    echo "Sales Rank : {$result->Items->Item->SalesRank}<br>"; 
    echo "ASIN : {$result->Items->Item->ASIN}<br>"; 
    echo "<br><img src=\"" . $result->Items->Item->MediumImage->URL . "\" /><br>"; 


?> 

また、これはExample.phpを実行した結果ですshown here.print_r($result);の結果はinvalid xml respnseです。私の場合のために

+0

最初に、「無効なXML応答」は**あなたのコード**によって生成されたテキストです。テストの 'if(isset($ response-> Items-> Item-> ItemAttributes-> Title) ) 'が失敗すると、そのエラーを設定するのではなく、応答の内容をダンプしてどのように見えるのですか? –

+0

見てくれてありがとう、本当にありがとう。最後に何週間もの進歩がなくても作業することができました。ありがとう!! –

+0

コードは私のために働く。結果のすべてを配列として出力します。 echo文は機能しますが、foreachループではないため、最初の結果しか表示されません。 foreachループに変更する方法は現時点では分かりませんが、私はそれに取り組んでいます。このスクリプトを一緒に解決したい場合は、私に連絡してください。私はユーザーフレンドリーなデザインですべての結果をフォーマットしようとしています –

答えて

0

は、私のエラーがInvalidClientTokenIdThe X.509 certificate or AWS access key ID provided does not exist in our records.は、私は単純に(非常にcarefuly)this guideで新しいアクセスおよび秘密鍵を作成し、自分のアソシエイトIDを確認するためにthis guideと呼ばれていました。

エラーを見つけるには、throw new Exception("Invalid xml response.");という行を無効にしてreturn ($response);を追加し、phpページを実行してください。エラーのリストについては、this pageを参照してください。

関連する問題