|
Server IP : 127.0.0.1 / Your IP : 127.0.0.1 Web Server : Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.6.3 System : Windows NT WIN-R7LTCC7BPLI 6.3 build 9200 (Windows Server 2012 R2 Datacenter Edition) i586 User : GerbangSIPAD ( 0) PHP Version : 5.6.3 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF Directory (0777) : C:/xampp5/php/pear/Services/ |
| [ Home ] | [ C0mmand ] | [ Upload File ] |
|---|
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
* Implementation of a developers backend for accessing Amazon's retail and
* assosciate services.
*
* PHP versions 4 and 5
*
* LICENSE: Copyright 2004 John Downey. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of The PEAR Group.
*
* @category Web Services
* @package Services_Amazon
* @author John Downey <jdowney@gmail.com>
* @author Tatsuya Tsuruoka <tatsuya.tsuruoka@gmail.com>
* @copyright 2004 John Downey
* @license http://www.freebsd.org/copyright/freebsd-license.html 2 Clause BSD License
* @version CVS: $Id: AmazonECS4.php 280260 2009-05-10 09:40:30Z ttsuruoka $
* @link http://pear.php.net/package/Services_Amazon/
* @filesource
*/
/**
* NOTICE:
* This class is for backward compatibility and should be considered obsolete.
* After August 15, 2009, all requests without a signature will be denied.
* You may as well use Services_Amazon when you create a new application.
*/
/**
* Uses PEAR class for error management
*/
require_once 'PEAR.php';
/**
* Uses HTTP_Request class to send and receive data from Amazon web servers
*/
require_once 'HTTP/Request.php';
/**
* Uses XML_Unserializer class to parse data received from Amazon
*/
require_once 'XML/Unserializer.php';
/**
* A default base URL that is specific to the locale
*
* - Amazon.com (US)
* http://webservices.amazon.com/onca/xml?Service=AWSECommerceService
* - Amazon.co.uk (UK)
* http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService
* - Amazon.de (DE)
* http://webservices.amazon.de/onca/xml?Service=AWSECommerceService
* - Amazon.co.jp (JP)
* http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService
* - Amazon.fr (FR)
* http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService
* - Amazon.ca (CA)
* http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService
*/
if (!defined('SERVICES_AMAZON_BASEURL')) {
define('SERVICES_AMAZON_BASEURL', 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService');
}
/**
* A service version
*
* Use this to retrieve a particular version of the Amazon ECS.
*/
if (!defined('SERVICES_AMAZON_ECSVERSION')) {
define('SERVICES_AMAZON_ECSVERSION', '2005-10-05');
}
/**
* Class for accessing and retrieving information from Amazon's Web Services
*
* @package Services_Amazon
* @author John Downey <jdowney@gmail.com>
* @author Tatsuya Tsuruoka <tatsuya.tsuruoka@gmail.com>
* @access public
* @version Release: 0.9.0
* @uses PEAR
* @uses HTTP_Request
* @uses XML_Unserializer
*/
class Services_AmazonECS4
{
/**
* An Amazon AccessKey/Subscription ID used when quering Amazon servers
*
* @access private
* @var string
*/
var $_keyid = null;
/**
* An Amazon Associate ID used in the URL's so a commision may be payed
*
* @access private
* @var string
*/
var $_associd = null;
/**
* A base URL used to build the query for the Amazon servers
*
* @access private
* @var string
*/
var $_baseurl = SERVICES_AMAZON_BASEURL;
/**
* A service version
*
* @access private
* @var string
*/
var $_version = SERVICES_AMAZON_ECSVERSION;
/**
* The time that the Amazon took to process the request
*
* @access private
* @var string
*/
var $_processing_time = null;
/**
* The last URL accessed to the Amazon (for debugging)
*
* @access private
* @var string
*/
var $_lasturl = null;
/**
* The raw result returned from the request
*
* @access private
* @var string
*/
var $_raw_result = null;
/**
* The cache object
*
* @access private
* @var object
*/
var $_cache = null;
/**
* The cache expire time
*
* Defaults to one hour.
*
* @access private
* @var integer
*/
var $_cache_expire = 3600;
/**
* Proxy server
*
* @access private
* @var string
*/
var $_proxy_host = null;
/**
* Proxy port
*
* @access private
* @var integer
*/
var $_proxy_port = null;
/**
* Proxy username
*
* @access private
* @var string
*/
var $_proxy_user = null;
/**
* Proxy password
*
* @access private
* @var string
*/
var $_proxy_pass = null;
/**
* Errors
*
* @access private
* @var array
*/
var $_errors = array();
/**
* Constructor
*
* @access public
* @param string $keyid An Amazon Access Key ID used when quering Amazon servers
* @param string $associd An Amazon Associate ID used in the URL's so a commision may be payed
* @see setAccessKeyID
* @see setAssociateID
* @see setBaseUrl
* @see setVersion
*/
function Services_AmazonECS4($keyid, $associd = null)
{
$this->_keyid = $keyid;
$this->_associd = $associd;
}
/**
* Retrieves the current version of this classes API
*
* @access public
* @static
* @return string The API version
*/
function getApiVersion()
{
return '0.9.0';
}
/**
* Sets an Access Key ID
*
* @access public
* @param string $subid An Access Key ID
* @return void
*/
function setAccessKeyID($keyid)
{
$this->_keyid = $keyid;
}
/**
* Sets a Subscription ID (for backward compatibility)
*
* @access public
* @param string $subid A Subscription ID
* @return void
*/
function setSubscriptionID($subid)
{
$this->_keyid = $subid;
}
/**
* Sets an Associate ID
*
* @access public
* @param string $associd An Associate ID
* @return void
*/
function setAssociateID($associd)
{
$this->_associd = $associd;
}
/**
* Sets the base URL
*
* @access public
* @param string $url The base url
* @return void
*/
function setBaseUrl($url)
{
$this->_baseurl = $url;
}
/**
* Sets the locale passed when making a query to Amazon
*
* Currently US, UK, DE, JP, FR, and CA are supported
*
* @access public
* @param string $locale The new locale to use
* @return mixed A PEAR_Error on error, a true on success
*/
function setLocale($locale)
{
$urls = array(
'US' => 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService',
'UK' => 'http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService',
'DE' => 'http://webservices.amazon.de/onca/xml?Service=AWSECommerceService',
'JP' => 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService',
'FR' => 'http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService',
'CA' => 'http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService',
);
$locale = strtoupper($locale);
if (empty($urls[$locale])) {
return PEAR::raiseError('Invalid locale');
}
$this->setBaseUrl($urls[$locale]);
return true;
}
/**
* Sets a version
*
* @access public
* @param string $version A service version
* @return void
*/
function setVersion($version)
{
$this->_version = $version;
}
/**
* Enables caching the data
*
* Requires Cache to be installed.
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $amazon->setCache('file', array('cache_dir' => 'cache/'));
* $amazon->setCacheExpire(86400); // 86400 seconds = 24 hours
* $result = $amazon->BrowseNodeLookup('283155');
* ?>
* </code>
*
* @access public
* @param string $container Name of container class
* @param array $container_options Array with container class options
* @return mixed A PEAR_Error on error, a true on success
* @see setCacheExpire()
*/
function setCache($container = 'file', $container_options = array())
{
if(!class_exists('Cache')){
@include_once 'Cache.php';
}
@$cache = new Cache($container, $container_options);
if (is_object($cache)) {
$this->_cache = $cache;
} else {
$this->_cache = null;
return PEAR::raiseError('Cache init failed');
}
return true;
}
/**
* Sets cache expire time
*
* Amazon dictates that any prices that are displayed that may be over an
* hour old should be accompanied by some sort of timestamp. You can get
* around that by expiring any queries that use the time in an hour (3600
* seconds).
*
* @access public
* @param integer $secs Expire time in seconds
* @return void
* @see setCache()
*/
function setCacheExpire($secs)
{
$this->_cache_expire = $secs;
}
/**
* Sets a proxy
*
* @access public
* @param string $host Proxy host
* @param int $port Proxy port
* @param string $user Proxy username
* @param string $pass Proxy password
*/
function setProxy($host, $port = 8080, $user = null, $pass = null)
{
$this->_proxy_host = $host;
$this->_proxy_port = $port;
$this->_proxy_user = $user;
$this->_proxy_pass = $pass;
}
/**
* Retrieves all error codes and messages
*
* <code>
* if (PEAR::isError($result)) {
* foreach ($amazon->getErrors() as $error) {
* echo $error['Code'];
* echo $error['Message'];
* }
* }
* </code>
*
* @access public
* @return array All errors
*/
function getErrors()
{
return $this->_errors;
}
/**
* Retrieves the error code and message
*
* <code>
* if (PEAR::isError($result)) {
* $error = $amazon->getError();
* echo $error['Code'];
* echo $error['Message'];
* }
* </code>
*
* @access public
* @return array All errors
*/
function getError()
{
return current($this->_errors);
}
/**
* Retrieves the processing time
*
* @access public
* @return string Processing time
*/
function getProcessingTime()
{
return $this->_processing_time;
}
/**
* Retrieves the last URL accessed to the Amazon (for debugging)
*
* @access public
* @return string The Last URL
*/
function getLastUrl()
{
return $this->_lasturl;
}
/**
* Retrieves the raw result
*
* @access public
* @return string The raw result
*/
function getRawResult()
{
return $this->_raw_result;
}
/**
* Retrieves information about a browse node
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $result = $amazon->BrowseNodeLookup('283155'); // 283155='Books'
* ?>
* </code>
*
* @access public
* @param string $browsenode_id The browse node ID
* @param array $options The optional parameters
* @return array The array of information returned by the query
*/
function BrowseNodeLookup($browsenode_id, $options = array())
{
$params = $options;
$params['Operation'] = 'BrowseNodeLookup';
$params['BrowseNodeId'] = $browsenode_id;
return $this->_sendRequest($params);
}
/**
* Adds items to an existing remote shopping cart
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $item = array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1);
* // $item = array(array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1),
* // array('OfferListingId' => 'bbbbbbbbbb', 'Quantity' => 10),
* // array('ASIN' => 'cccccccccc', 'Quantity' => 20));
* $result = $amazon->CartAdd('[Cart ID]', '[HMAC]', $item);
* ?>
* </code>
*
* @access public
* @param string $cart_id A unique identifier for a cart
* @param string $hmac A unique security token
* @param array $item Products and the quantities
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CartClear(), CartCreate(), CartModify()
*/
function CartAdd($cart_id, $hmac, $item, $options = array())
{
$params = $options;
$params['Operation'] = 'CartAdd';
$params['CartId'] = $cart_id;
$params['HMAC'] = $hmac;
$params += $this->_assembleItemParameter($item);
return $this->_sendRequest($params);
}
/**
* Removes all the contents of a remote shopping cart
*
* @access public
* @param string $cart_id A unique identifier for a cart
* @param string $hmac A unique security token
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CartAdd(), CartCreate(), CartGet(), CartModify()
*/
function CartClear($cart_id, $hmac, $options = array())
{
$params = $options;
$params['Operation'] = 'CartClear';
$params['CartId'] = $cart_id;
$params['HMAC'] = $hmac;
return $this->_sendRequest($params);
}
/**
* Creates a new remote shopping cart
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $item = array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1);
* // $item = array(array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1),
* // array('ASIN' => 'cccccccccc', 'Quantity' => 20));
* $result = $amazon->CartCreate($item);
* ?>
* </code>
*
* @access public
* @param array $item Products and the quantities
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CartAdd(), CartClear(), CartGet(), CartModify()
*/
function CartCreate($item, $options = array())
{
$params = $options;
$params['Operation'] = 'CartCreate';
$params += $this->_assembleItemParameter($item);
return $this->_sendRequest($params);
}
/**
* Retrieves the contents of a remote shopping cart
*
* @access public
* @param string $cart_id A unique identifier for a cart
* @param string $hmac A unique security token
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CartAdd(), CartClear(), CartCreate(), CartModify()
*/
function CartGet($cart_id, $hmac, $options = array())
{
$params = $options;
$params['Operation'] = 'CartGet';
$params['CartId'] = $cart_id;
$params['HMAC'] = $hmac;
return $this->_sendRequest($params);
}
/**
* Modifies the quantity of items in a cart and changes cart items to saved items
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $item = array('CartItemId' => 'aaaaaaaaaa', 'Quantity' => 1);
* // $item = array('CartItemId' => 'aaaaaaaaaa', 'Action' => 'SaveForLater');
* // $item = array(array('CartItemId' => 'aaaaaaaaaa', 'Quantity' => 1),
* // array('CartItemId' => 'cccccccccc', 'Quantity' => 20));
* $result = $amazon->CartModify('[Cart ID]', '[HMAC]', $item);
* ?>
* </code>
*
* @access public
* @param string $cart_id A unique identifier for a cart
* @param string $hmac A unique security token
* @param array $item The CartItemId and the quantities or the Action
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CartAdd(), CartClear(), CartCreate(), CartGet()
*/
function CartModify($cart_id, $hmac, $item, $options = array())
{
$params = $options;
$params['Operation'] = 'CartModify';
$params['CartId'] = $cart_id;
$params['HMAC'] = $hmac;
$params += $this->_assembleItemParameter($item);
return $this->_sendRequest($params);
}
/**
* Retrieves publicly available content written by specific Amazon customers
*
* @access public
* @param string $customer_id A customer ID
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CustomerContentSearch()
*/
function CustomerContentLookup($customer_id, $options = array())
{
$params = $options;
$params['Operation'] = 'CustomerContentLookup';
$params['CustomerId'] = $customer_id;
return $this->_sendRequest($params);
}
/**
* Searches for Amazon customers by name or email address
*
* @access public
* @param array $customer A customer's name or its email
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see CustomerContentLookup()
*/
function CustomerContentSearch($customer = null, $options = array())
{
$params = $options;
$params['Operation'] = 'CustomerContentSearch';
$params += $customer;
return $this->_sendRequest($params);
}
/**
* Retrieves information about operations and response groups
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $result = $amazon->Help('Operation', 'ItemLookup');
* ?>
* </code>
*
* @access public
* @param string $help_type The type of information
* @param string $about The name of an operation or a response group
* @param array $options The optional parameters
* @return array The array of information returned by the query
*/
function Help($help_type, $about, $options = array())
{
$params = $options;
$params['Operation'] = 'Help';
$params['HelpType'] = $help_type;
$params['About'] = $about;
return $this->_sendRequest($params);
}
/**
* Retrieves information for products
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $options = array();
* $options['ResponseGroup'] = 'Large';
* $result = $amazon->ItemLookup('[ASIN(s)]', $options);
* ?>
* </code>
*
* @access public
* @param string $item_id Product IDs
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see ItemSearch()
*/
function ItemLookup($item_id, $options = array())
{
$params = $options;
$params['Operation'] = 'ItemLookup';
if (is_array($item_id)) {
$item_id = implode(',', $item_id);
}
$params['ItemId'] = $item_id;
return $this->_sendRequest($params);
}
/**
* Searches for products
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $options = array();
* $options['Keywords'] = 'sushi';
* $options['Sort'] = 'salesrank';
* $options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
* $result = $amazon->ItemSearch('Books', $options);
* ?>
* </code>
*
* @access public
* @param string $search_index A search index
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see ItemLookup()
*/
function ItemSearch($search_index, $options = array())
{
$params = $options;
$params['Operation'] = 'ItemSearch';
$params['SearchIndex'] = $search_index;
return $this->_sendRequest($params);
}
/**
* Retrieves products in a specific list
*
* @access public
* @param string $list_type The type of list
* @param string $list_id A list ID
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see ListSearch()
*/
function ListLookup($list_type, $list_id, $options = array())
{
$params = $options;
$params['Operation'] = 'ListLookup';
$params['ListType'] = $list_type;
$params['ListId'] = $list_id;
return $this->_sendRequest($params);
}
/**
* Searches for a wish list, baby registry, or wedding registry
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $keywords = array('Name' => 'hoge');
* $result = $amazon->ListSearch('WishList', $keywords);
* ?>
* </code>
*
* @access public
* @param string $list_type The type of list
* @param array $keywords Parameters to search for
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see ListLookup()
*/
function ListSearch($list_type, $keywords, $options = array())
{
$params = $options;
$params['Operation'] = 'ListSearch';
$params['ListType'] = $list_type;
$params += $keywords;
return $this->_sendRequest($params);
}
/**
* Retrieves information about Amazon zShops and Marketplace products
*
* @access public
* @param string $id_type The type of ID
* @param string $id The exchange ID or the listing ID
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see SellerListingSearch()
*/
function SellerListingLookup($id_type, $id, $options = array())
{
$params = $options;
$params['Operation'] = 'SellerListingLookup';
$params['IdType'] = $id_type;
$params['Id'] = $id;
return $this->_sendRequest($params);
}
/**
* Searches for Amazon zShops and Marketplace products
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $keywords = array('Keywords' => 'pizza');
* $result = $amazon->SellerListingSearch('zShops', $keywords);
* ?>
* </code>
*
* @access public
* @param string $search_index The type of seller listings
* @param array $options The optional parameters
* @return array The array of information returned by the query
* @see SellerListingLookup()
*/
function SellerListingSearch($search_index, $options = array())
{
$params = $options;
$params['Operation'] = 'SellerListingSearch';
$params['SearchIndex'] = $search_index;
return $this->_sendRequest($params);
}
/**
* Retrieves information about specific sellers
*
* @access public
* @param string $seller_id IDs for Amazon sellers
* @param array $options The optional parameters
* @return array The array of information returned by the query
*/
function SellerLookup($seller_id, $options = array())
{
$params = $options;
$params['Operation'] = 'SellerLookup';
$params['SellerId'] = $seller_id;
return $this->_sendRequest($params);
}
/**
* Retrieves products that are similar to Amazon products
*
* @access public
* @param string $item_id Product IDs
* @param array $options The optional parameters
* @return array The array of information returned by the query
*/
function SimilarityLookup($item_id, $options = array())
{
$params = $options;
$params['Operation'] = 'SimilarityLookup';
if (is_array($item_id)) {
$item_id = implode(',', $item_id);
}
$params['ItemId'] = $item_id;
return $this->_sendRequest($params);
}
/**
* Retrieves information about the status of financial transactions
*
* @access public
* @param string $transaction_id Transaction IDs
* @param array $options The optional parameters
* @return array The array of information returned by the query
*/
function TransactionLookup($transaction_id, $options = array())
{
$params = $options;
$params['Operation'] = 'TransactionLookup';
$params['TransactionId'] = $transaction_id;
return $this->_sendRequest($params);
}
/**
* Combines requests for the same operation into a single request
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $shared = array('SearchIndex' => 'Books',
* 'Keywords' => 'php');
* $params1 = array('ItemPage' => '1');
* $params2 = array('ItemPage' => '2');
* $result = $amazon->doBatch('ItemSearch', $shared, $params1, $params2);
* ?>
* </code>
*
* @access public
* @param string $operation The operation
* @param array $shared Shared parameters
* @param array $params1 The parameters specific to the first request
* @param array $params2 The parameters specific to the second request
* @return array The array of information returned by the query
*/
function doBatch($operation, $shared, $params1 = array(), $params2 = array())
{
$params = array();
$params['Operation'] = $operation;
foreach ($shared as $k => $v) {
$params[$operation . '.Shared.' . $k] = $v;
}
foreach ($params1 as $k => $v) {
$params[$operation . '.1.' . $k] = $v;
}
foreach ($params2 as $k => $v) {
$params[$operation . '.2.' . $k] = $v;
}
return $this->_sendRequest($params);
}
/**
* Combines the different operations into a single request
*
* Example:
* <code>
* <?php
* $amazon = new Services_AmazonECS4('[your Access Key ID here]');
* $params1 = array('SearchIndex' => 'Books',
* 'Title' => 'sushi');
* $params2 = array('Keywords' => 'tempura');
* $result = $amazon->doMultiOperation('ItemSearch', $params1,
* 'SellerListingSearch', $params2);
* ?>
* </code>
*
* @access public
* @param string $operation1 The first operation
* @param array $params1 The parameters specific to the first request
* @param string $operation2 The second operation
* @param array $params2 The parameters specific to the second request
* @return array The array of information returned by the query
*/
function doMultiOperation($operation1, $params1, $operation2, $params2)
{
$params = array();
$params['Operation'] = $operation1 . ',' . $operation2;
foreach ($params1 as $k => $v) {
$params[$operation1 . '.1.' . $k] = $v;
}
foreach ($params2 as $k => $v) {
$params[$operation2 . '.1.' . $k] = $v;
}
return $this->_sendRequest($params);
}
/**
* Assembles the Item parameters
*
* @access private
* @param array $items The items
* @return array The item parameters
*/
function _assembleItemParameter($items)
{
$params = array();
if (!is_array(current($items))) {
$items = array(0 => $items);
}
$i = 1;
foreach ($items as $item) {
foreach ($item as $k => $v) {
$params['Item.' . $i . '.' . $k] = $v;
}
$i++;
}
return $params;
}
/**
* Ignores the caching of specific operations
*
* @access private
* @param string $operation The operation
* @return bool Returns true if the operation isn't cached, false otherwise
*/
function _ignoreCache($operation)
{
$ignore = array('CartAdd', 'CartClear', 'CartGet', 'CartModify', 'TransactionLookup');
if (!strchr($operation, ',')) {
return in_array($operation, $ignore);
}
$operations = explode(',', $operation);
foreach ($operations as $v) {
if (in_array($v, $ignore)) {
return true;
}
}
return false;
}
/**
* Generates ID used as cache identifier
*
* @access private
* @param array $params
* @return string Cache ID
*/
function _generateCacheId($params)
{
unset($params['AWSAccessKeyId']);
unset($params['AssociateTag']);
$str = '';
foreach ($params as $k => $v) {
$str .= $k . $v;
}
return md5($str);
}
/**
* Builds a URL
*
* @access private
* @param array $params
* @return string URL
*/
function _buildUrl($params)
{
$params['AWSAccessKeyId'] = $this->_keyid;
$params['AssociateTag'] = $this->_associd;
$params['Version'] = $this->_version;
$url = $this->_baseurl;
foreach ($params as $k => $v) {
$url .= '&' . $k . '=' . urlencode($v);
}
return $url;
}
/**
* Sends a request
*
* @access private
* @param string $url
* @return string The response
*/
function _sendHttpRequest($url)
{
$http = &new HTTP_Request($url);
$http->setHttpVer('1.0');
$http->addHeader('User-Agent', 'Services_AmazonECS4/' . $this->getApiVersion());
if ($this->_proxy_host) {
$http->setProxy($this->_proxy_host, $this->_proxy_port, $this->_proxy_user, $this->_proxy_pass);
}
$result = $http->sendRequest();
if (PEAR::isError($result)) {
return PEAR::raiseError('HTTP_Request::sendRequest failed: ' . $result->message);
}
if ($http->getResponseCode() != 200){
return PEAR::raiseError('Amazon returned invalid HTTP response code ' . $http->getResponseCode());
}
return $http->getResponseBody();
}
/**
* Parses raw XML result
*
* @access private
* @param string $raw_result
* @return string The contents
*/
function _parseRawResult($raw_result)
{
$xml = &new XML_Unserializer();
$xml->setOption(XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE, true);
$xml->setOption(XML_UNSERIALIZER_OPTION_FORCE_ENUM,
array('Item', 'Review', 'EditorialReview',
'Parameter', 'Author', 'Creator', 'ResponseGroup', 'Error'));
$xml->unserialize($raw_result, false);
$data = $xml->getUnserializedData();
if (PEAR::isError($data)) {
return $data;
}
if (isset($data['Error'])) {
$this->_errors = $data['Error'];
return PEAR::raiseError(implode(':', $this->getError()));
}
if (isset($data['OperationRequest']['RequestProcessingTime'])) {
$this->_processing_time = $data['OperationRequest']['RequestProcessingTime'];
}
if (isset($data['OperationRequest']['Errors'])) {
$this->_errors = $data['OperationRequest']['Errors']['Error'];
return PEAR::raiseError(implode(':', $this->getError()));
}
// Get values of the second level content elements
unset($data['xmlns']);
unset($data['OperationRequest']);
$contents = array();
$keys = array_keys($data);
foreach ($keys as $v) {
if (strstr($v, 'Response')) {
$data[$v] = current($data[$v]);
$contents[$v] = $data[$v];
} else {
$contents = $data[$v];
}
$result = $this->_checkContentError($data[$v]);
if (PEAR::isError($result)) {
return $result;
}
}
return $contents;
}
/**
* Checks error codes at the content elements
*
* @access private
* @param array $content Values of the content elements
* @return array mixed A PEAR_Error on error, a true on success
* @see _parseRawResult
*/
function _checkContentError($content)
{
if (isset($content['Request']['Errors'])) {
$this->_errors = $content['Request']['Errors']['Error'];
return PEAR::raiseError(implode(':', $this->getError()));
} else if (isset($content[0])) {
$errors = array();
foreach ($content as $v) {
if (isset($v['Request']['Errors']['Error'])) {
$errors = array_merge($errors, $v['Request']['Errors']['Error']);
}
}
if (!empty($errors)) {
$this->_errors = $errors;
return PEAR::raiseError(implode(':', $this->getError()));
}
}
return true;
}
/**
* Sends the request to Amazon
*
* @access private
* @param array $params The array of request parameters
* @return array The array of information returned by the query
*/
function _sendRequest($params)
{
$this->_errors = array();
if (is_null($this->_keyid)) {
return PEAR::raiseError('Access Key ID have not been set');
}
$url = $this->_buildUrl($params);
$this->_lasturl = $url;
if (PEAR::isError($url)) {
return $url;
}
// Return cached data if available
$cache_id = false;
if (isset($this->_cache) && !$this->_ignoreCache($params['Operation'])) {
$cache_id = $this->_generateCacheId($params);
$cache = $this->_cache->get($cache_id);
if (!is_null($cache)) {
$this->_processing_time = 0;
return $cache;
}
}
$result = $this->_sendHttpRequest($url);
$this->_raw_result = $result;
if (PEAR::isError($result)) {
return $result;
}
$contents = $this->_parseRawResult($result);
if (PEAR::isError($contents)) {
return $contents;
}
if ($cache_id) {
$this->_cache->save($cache_id, $contents, $this->_cache_expire);
}
return $contents;
}
}
?>