#php #xml #api #amazon-web-services
#php #xml #API #amazon-веб-сервисы
Вопрос:
Привет, я начинающий программист, пытающийся интегрировать API в свое мобильное приложение, чтобы я мог просматривать товары из Amazon из своего приложения. Я выполнил все 6 простых шагов здесь, но пример не сработал для меня, как показано здесь.
Вот мои коды Amazon 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-dTH:i:sZ");
$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("~", "~", rawurlencode($param));
$value = str_replace("~", "~", rawurlencode($value));
$canonicalized_query[] = $param."=".$value;
}
$canonicalized_query = implode("amp;", $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("~", "~", rawurlencode($signature));
/* create request */
$request = "http://".$host.$uri."?".$canonicalized_query."amp;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;
}
}
?>
amazon_api_class.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);
}
}
?>
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 показано здесь.Результатом print_r($result);
является invalid xml respnse
.
Комментарии:
1. Во-первых, очевидное: «Неверный XML-ответ» — это текст, который генерируется вашим кодом , поэтому, когда тест
if (isset($response->Items->Item->ItemAttributes->Title))
завершается неудачей, почему бы вам не сбросить содержимое ответа и посмотреть, как он выглядит, вместо того, чтобы просто устанавливать эту ошибку?2. Эй, чувак, спасибо, что просмотрел, и вы действительно правы. Наконец-то есть с чем работать после нескольких недель отсутствия прогресса. Спасибо!!
3. Код работает для меня. Он печатает все результаты в виде массива. Оператор echo работает, но он показывает только первый результат, потому что это не цикл foreach. На данный момент я не уверен, как его преобразовать в цикл foreach, хотя я работаю над этим. Свяжитесь со мной, если вы хотите решить этот сценарий вместе. Я планирую отформатировать все результаты в удобном для пользователя дизайне
4. Привет, @michaeld, я не думаю, что я сильно помогу в решении скрипта, но я действительно не прочь попробовать! Кроме того, на странице результатов отображается какой-либо SimpleXML для ya? В моем случае у меня есть куча кодов SimpleXML над моим результатом. В настоящее время у меня возникла проблема с преобразованием этого формата SimpleXML в формат JSON.
Ответ №1:
В моем случае моя ошибка заключалась InvalidClientTokenId
в том, The X.509 certificate or AWS access key ID provided does not exist in our records.
что я просто (очень осторожно) создал новый доступ и секретные ключи с помощью этого руководства и сослался на это руководство, чтобы подтвердить свой идентификатор партнера.
Чтобы найти свою ошибку, просто обнулите строку с throw new Exception("Invalid xml response.");
помощью и добавьте return ($response);
и запустите страницу php. Список ошибок см. На этой странице.