Services_Amazon
[ class tree: Services_Amazon ] [ index: Services_Amazon ] [ all elements ]

Source for file AmazonECS4.php

Documentation is available at AmazonECS4.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. /**
  4. * Implementation of a developers backend for accessing Amazon's retail and
  5. * assosciate services.
  6. *
  7. * PHP versions 4 and 5
  8. *
  9. * LICENSE: Copyright 2004 John Downey. All rights reserved.
  10. *
  11. * Redistribution and use in source and binary forms, with or without
  12. * modification, are permitted provided that the following conditions are met:
  13. *
  14. * o Redistributions of source code must retain the above copyright notice, this
  15. *   list of conditions and the following disclaimer.
  16. * o Redistributions in binary form must reproduce the above copyright notice,
  17. *   this list of conditions and the following disclaimer in the documentation
  18. *   and/or other materials provided with the distribution.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY EXPRESS OR
  21. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  22. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  23. * EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  24. * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  25. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  27. * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  29. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. *
  31. * The views and conclusions contained in the software and documentation are
  32. * those of the authors and should not be interpreted as representing official
  33. * policies, either expressed or implied, of The PEAR Group.
  34. *
  35. @category  Web Services
  36. @package   Services_Amazon
  37. @author    John Downey <jdowney@gmail.com>
  38. @author    Tatsuya Tsuruoka <tatsuya.tsuruoka@gmail.com>
  39. @copyright 2004 John Downey
  40. @license   http://www.freebsd.org/copyright/freebsd-license.html 2 Clause BSD License
  41. @version   CVS: $Id: AmazonECS4.php 280260 2009-05-10 09:40:30Z ttsuruoka $
  42. @link      http://pear.php.net/package/Services_Amazon/
  43. @filesource
  44. */
  45.  
  46. /**
  47.  * NOTICE:
  48.  * This class is for backward compatibility and should be considered obsolete.
  49.  * After August 15, 2009, all requests without a signature will be denied.
  50.  * You may as well use Services_Amazon when you create a new application.
  51.  */
  52.  
  53. /**
  54. * Uses PEAR class for error management
  55. */
  56. require_once 'PEAR.php';
  57.  
  58. /**
  59. * Uses HTTP_Request class to send and receive data from Amazon web servers
  60. */
  61. require_once 'HTTP/Request.php';
  62.  
  63. /**
  64. * Uses XML_Unserializer class to parse data received from Amazon
  65. */
  66. require_once 'XML/Unserializer.php';
  67.  
  68. /**
  69. * A default base URL that is specific to the locale
  70. *
  71. * - Amazon.com (US)
  72. *   http://webservices.amazon.com/onca/xml?Service=AWSECommerceService
  73. * - Amazon.co.uk (UK)
  74. *   http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService
  75. * - Amazon.de (DE)
  76. *   http://webservices.amazon.de/onca/xml?Service=AWSECommerceService
  77. * - Amazon.co.jp (JP)
  78. *   http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService
  79. * - Amazon.fr (FR)
  80. *   http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService
  81. * - Amazon.ca (CA)
  82. *   http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService
  83. */
  84. if (!defined('SERVICES_AMAZON_BASEURL')) {
  85.     define('SERVICES_AMAZON_BASEURL''http://webservices.amazon.com/onca/xml?Service=AWSECommerceService');
  86. }
  87. /**
  88. * A service version
  89. *
  90. * Use this to retrieve a particular version of the Amazon ECS.
  91. */
  92. if (!defined('SERVICES_AMAZON_ECSVERSION')) {
  93.     define('SERVICES_AMAZON_ECSVERSION''2005-10-05');
  94. }
  95.  
  96. /**
  97. * Class for accessing and retrieving information from Amazon's Web Services
  98. *
  99. @package Services_Amazon
  100. @author  John Downey <jdowney@gmail.com>
  101. @author  Tatsuya Tsuruoka <tatsuya.tsuruoka@gmail.com>
  102. @access  public
  103. @version Release: 0.9.0
  104. @uses    PEAR
  105. @uses    HTTP_Request
  106. @uses    XML_Unserializer
  107. */
  108. {
  109.     /**
  110.     * An Amazon AccessKey/Subscription ID used when quering Amazon servers
  111.     *
  112.     * @access private
  113.     * @var    string 
  114.     */
  115.     var $_keyid = null;
  116.  
  117.     /**
  118.     * An Amazon Associate ID used in the URL's so a commision may be payed
  119.     *
  120.     * @access private
  121.     * @var    string 
  122.     */
  123.     var $_associd = null;
  124.  
  125.     /**
  126.     * A base URL used to build the query for the Amazon servers
  127.     *
  128.     * @access private
  129.     * @var    string 
  130.     */
  131.     var $_baseurl = SERVICES_AMAZON_BASEURL;
  132.  
  133.     /**
  134.     * A service version
  135.     *
  136.     * @access private
  137.     * @var    string 
  138.     */
  139.     var $_version = SERVICES_AMAZON_ECSVERSION;
  140.  
  141.     /**
  142.     * The time that the Amazon took to process the request
  143.     * 
  144.     * @access private
  145.     * @var    string 
  146.     */
  147.     var $_processing_time = null;
  148.  
  149.     /**
  150.     * The last URL accessed to the Amazon (for debugging)
  151.     *
  152.     * @access private
  153.     * @var    string 
  154.     */
  155.     var $_lasturl = null;
  156.  
  157.     /**
  158.     * The raw result returned from the request
  159.     *
  160.     * @access private
  161.     * @var    string 
  162.     */
  163.     var $_raw_result = null;
  164.  
  165.     /**
  166.     * The cache object
  167.     *
  168.     * @access private
  169.     * @var    object 
  170.     */
  171.     var $_cache = null;
  172.  
  173.     /**
  174.     * The cache expire time
  175.     *
  176.     * Defaults to one hour.
  177.     *
  178.     * @access private
  179.     * @var    integer 
  180.     */
  181.     var $_cache_expire = 3600;
  182.  
  183.     /**
  184.     * Proxy server
  185.     *
  186.     * @access private
  187.     * @var    string 
  188.     */
  189.     var $_proxy_host = null;
  190.  
  191.     /**
  192.     * Proxy port
  193.     *
  194.     * @access private
  195.     * @var    integer 
  196.     */
  197.     var $_proxy_port = null;
  198.  
  199.     /**
  200.     * Proxy username
  201.     *
  202.     * @access private
  203.     * @var    string 
  204.     */
  205.     var $_proxy_user = null;
  206.  
  207.     /**
  208.     * Proxy password
  209.     *
  210.     * @access private
  211.     * @var    string 
  212.     */
  213.     var $_proxy_pass = null;
  214.  
  215.     /**
  216.     * Errors
  217.     *
  218.     * @access private
  219.     * @var    array 
  220.     */
  221.     var $_errors = array();
  222.  
  223.     /**
  224.     * Constructor
  225.     *
  226.     * @access public
  227.     * @param  string $keyid An Amazon Access Key ID used when quering Amazon servers
  228.     * @param  string $associd An Amazon Associate ID used in the URL's so a commision may be payed
  229.     * @see    setAccessKeyID
  230.     * @see    setAssociateID
  231.     * @see    setBaseUrl
  232.     * @see    setVersion
  233.     */
  234.     function Services_AmazonECS4($keyid$associd = null)
  235.     {
  236.         $this->_keyid $keyid;
  237.         $this->_associd $associd;
  238.     }
  239.  
  240.     /**
  241.     * Retrieves the current version of this classes API
  242.     *
  243.     * @access public
  244.     * @static
  245.     * @return string The API version
  246.     */
  247.     function getApiVersion()
  248.     {
  249.         return '0.9.0';
  250.     }
  251.  
  252.     /**
  253.     * Sets an Access Key ID
  254.     *
  255.     * @access public
  256.     * @param  string $subid An Access Key ID
  257.     * @return void 
  258.     */
  259.     function setAccessKeyID($keyid)
  260.     {
  261.         $this->_keyid $keyid;
  262.     }
  263.  
  264.     /**
  265.     * Sets a Subscription ID (for backward compatibility)
  266.     *
  267.     * @access public
  268.     * @param  string $subid A Subscription ID
  269.     * @return void 
  270.     */
  271.     function setSubscriptionID($subid)
  272.     {
  273.         $this->_keyid $subid;
  274.     }
  275.  
  276.     /**
  277.     * Sets an Associate ID
  278.     *
  279.     * @access public
  280.     * @param  string $associd An Associate ID
  281.     * @return void 
  282.     */
  283.     function setAssociateID($associd)
  284.     {
  285.         $this->_associd $associd;
  286.     }
  287.  
  288.     /**
  289.     * Sets the base URL
  290.     *
  291.     * @access public
  292.     * @param  string $url The base url
  293.     * @return void 
  294.     */
  295.     function setBaseUrl($url)
  296.     {
  297.         $this->_baseurl $url;
  298.     }
  299.  
  300.     /**
  301.     * Sets the locale passed when making a query to Amazon
  302.     *
  303.     * Currently US, UK, DE, JP, FR, and CA are supported
  304.     *
  305.     * @access public
  306.     * @param  string $locale The new locale to use
  307.     * @return mixed A PEAR_Error on error, a true on success
  308.     */
  309.     function setLocale($locale)
  310.     {
  311.         $urls = array(
  312.             'US' => 'http://webservices.amazon.com/onca/xml?Service=AWSECommerceService',
  313.             'UK' => 'http://webservices.amazon.co.uk/onca/xml?Service=AWSECommerceService',
  314.             'DE' => 'http://webservices.amazon.de/onca/xml?Service=AWSECommerceService',
  315.             'JP' => 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService',
  316.             'FR' => 'http://webservices.amazon.fr/onca/xml?Service=AWSECommerceService',
  317.             'CA' => 'http://webservices.amazon.ca/onca/xml?Service=AWSECommerceService',
  318.         );
  319.         $locale strtoupper($locale);
  320.         if (empty($urls[$locale])) {
  321.             return PEAR::raiseError('Invalid locale');
  322.         }
  323.         $this->setBaseUrl($urls[$locale]);
  324.         return true;
  325.     }
  326.  
  327.     /**
  328.     * Sets a version
  329.     *
  330.     * @access public
  331.     * @param  string $version A service version
  332.     * @return void 
  333.     */
  334.     function setVersion($version)
  335.     {
  336.         $this->_version $version;
  337.     }
  338.  
  339.     /**
  340.     * Enables caching the data
  341.     *
  342.     * Requires Cache to be installed.
  343.     * Example:
  344.     * <code>
  345.     * <?php
  346.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  347.     * $amazon->setCache('file', array('cache_dir' => 'cache/'));
  348.     * $amazon->setCacheExpire(86400); // 86400 seconds = 24 hours
  349.     * $result = $amazon->BrowseNodeLookup('283155');
  350.     * ?>
  351.     * </code>
  352.     *
  353.     * @access public
  354.     * @param  string $container Name of container class
  355.     * @param  array $container_options Array with container class options
  356.     * @return mixed A PEAR_Error on error, a true on success
  357.     * @see    setCacheExpire()
  358.     */
  359.     function setCache($container 'file'$container_options = array())
  360.     {
  361.         if(!class_exists('Cache')){
  362.             @include_once 'Cache.php';
  363.         }
  364.         
  365.         @$cache = new Cache($container$container_options);
  366.         
  367.         if (is_object($cache)) {
  368.             $this->_cache $cache;
  369.         else {
  370.             $this->_cache = null;
  371.             return PEAR::raiseError('Cache init failed');
  372.         }
  373.  
  374.         return true;
  375.     }
  376.     
  377.     /**
  378.     * Sets cache expire time
  379.     * 
  380.     * Amazon dictates that any prices that are displayed that may be over an
  381.     * hour old should be accompanied by some sort of timestamp. You can get
  382.     * around that by expiring any queries that use the time in an hour (3600
  383.     * seconds).
  384.     *
  385.     * @access public
  386.     * @param  integer $secs Expire time in seconds
  387.     * @return void 
  388.     * @see    setCache()
  389.     */
  390.     function setCacheExpire($secs)
  391.     {
  392.         $this->_cache_expire $secs;
  393.     }
  394.  
  395.     /**
  396.     * Sets a proxy
  397.     *
  398.     * @access public
  399.     * @param string $host Proxy host
  400.     * @param int $port Proxy port
  401.     * @param string $user Proxy username
  402.     * @param string $pass Proxy password
  403.     */
  404.     function setProxy($host$port = 8080$user = null$pass = null)
  405.     {
  406.         $this->_proxy_host $host;
  407.         $this->_proxy_port $port;
  408.         $this->_proxy_user $user;
  409.         $this->_proxy_pass $pass;
  410.     }
  411.  
  412.     /**
  413.     * Retrieves all error codes and messages
  414.     *
  415.     * <code>
  416.     * if (PEAR::isError($result)) {
  417.     *     foreach ($amazon->getErrors() as $error) {
  418.     *         echo $error['Code'];
  419.     *         echo $error['Message'];
  420.     *     }
  421.     * }
  422.     * </code>
  423.     *
  424.     * @access public
  425.     * @return array All errors
  426.     */
  427.     function getErrors()
  428.     {
  429.         return $this->_errors;
  430.     }
  431.     
  432.     /**
  433.     * Retrieves the error code and message
  434.     *
  435.     * <code>
  436.     * if (PEAR::isError($result)) {
  437.     *     $error = $amazon->getError();
  438.     *     echo $error['Code'];
  439.     *     echo $error['Message'];
  440.     * }
  441.     * </code>
  442.     *
  443.     * @access public
  444.     * @return array All errors
  445.     */
  446.     function getError()
  447.     {
  448.         return current($this->_errors);
  449.     }
  450.  
  451.     /**
  452.     * Retrieves the processing time
  453.     *
  454.     * @access public
  455.     * @return string Processing time
  456.     */
  457.     function getProcessingTime()
  458.     {
  459.         return $this->_processing_time;
  460.     }
  461.  
  462.     /**
  463.     * Retrieves the last URL accessed to the Amazon (for debugging)
  464.     *
  465.     * @access public
  466.     * @return string The Last URL
  467.     */
  468.     function getLastUrl()
  469.     {
  470.         return $this->_lasturl;
  471.     }
  472.  
  473.     /**
  474.      * Retrieves the raw result
  475.      *
  476.      * @access public
  477.      * @return string The raw result
  478.      */
  479.     function getRawResult()
  480.     {
  481.         return $this->_raw_result;
  482.     }
  483.  
  484.     /**
  485.     * Retrieves information about a browse node
  486.     *
  487.     * Example:
  488.     * <code>
  489.     * <?php
  490.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  491.     * $result = $amazon->BrowseNodeLookup('283155'); // 283155='Books'
  492.     * ?>
  493.     * </code>
  494.     *
  495.     * @access public
  496.     * @param  string $browsenode_id The browse node ID
  497.     * @param  array $options The optional parameters
  498.     * @return array The array of information returned by the query
  499.     */
  500.     function BrowseNodeLookup($browsenode_id$options = array())
  501.     {
  502.         $params $options;
  503.         $params['Operation''BrowseNodeLookup';
  504.         $params['BrowseNodeId'$browsenode_id;
  505.         return $this->_sendRequest($params);
  506.     }
  507.  
  508.     /**
  509.     * Adds items to an existing remote shopping cart
  510.     *
  511.     * Example:
  512.     * <code>
  513.     * <?php
  514.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  515.     * $item = array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1);
  516.     * // $item = array(array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1),
  517.     * //               array('OfferListingId' => 'bbbbbbbbbb', 'Quantity' => 10),
  518.     * //               array('ASIN' => 'cccccccccc', 'Quantity' => 20));
  519.     * $result = $amazon->CartAdd('[Cart ID]', '[HMAC]', $item);
  520.     * ?>
  521.     * </code>
  522.     *
  523.     * @access public
  524.     * @param  string $cart_id A unique identifier for a cart
  525.     * @param  string $hmac A unique security token
  526.     * @param  array $item Products and the quantities
  527.     * @param  array $options The optional parameters
  528.     * @return array The array of information returned by the query
  529.     * @see    CartClear(), CartCreate(), CartModify()
  530.     */
  531.     function CartAdd($cart_id$hmac$item$options = array())
  532.     {
  533.         $params $options;
  534.         $params['Operation''CartAdd';
  535.         $params['CartId'$cart_id;
  536.         $params['HMAC'$hmac;
  537.         $params += $this->_assembleItemParameter($item);
  538.         return $this->_sendRequest($params);
  539.     }
  540.  
  541.     /**
  542.     * Removes all the contents of a remote shopping cart
  543.     *
  544.     * @access public
  545.     * @param  string $cart_id A unique identifier for a cart
  546.     * @param  string $hmac A unique security token
  547.     * @param  array $options The optional parameters
  548.     * @return array The array of information returned by the query
  549.     * @see    CartAdd(), CartCreate(), CartGet(), CartModify()
  550.     */
  551.     function CartClear($cart_id$hmac$options = array())
  552.     {
  553.         $params $options;
  554.         $params['Operation''CartClear';
  555.         $params['CartId'$cart_id;
  556.         $params['HMAC'$hmac;
  557.         return $this->_sendRequest($params);
  558.     }
  559.  
  560.     /**
  561.     * Creates a new remote shopping cart
  562.     *
  563.     * Example:
  564.     * <code>
  565.     * <?php
  566.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  567.     * $item = array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1);
  568.     * // $item = array(array('ASIN' => 'aaaaaaaaaa', 'Quantity' => 1),
  569.     * //               array('ASIN' => 'cccccccccc', 'Quantity' => 20));
  570.     * $result = $amazon->CartCreate($item);
  571.     * ?>
  572.     * </code>
  573.     *
  574.     * @access public
  575.     * @param  array $item Products and the quantities
  576.     * @param  array $options The optional parameters
  577.     * @return array The array of information returned by the query
  578.     * @see    CartAdd(), CartClear(), CartGet(), CartModify()
  579.     */
  580.     function CartCreate($item$options = array())
  581.     {
  582.         $params $options;
  583.         $params['Operation''CartCreate';
  584.         $params += $this->_assembleItemParameter($item);
  585.         return $this->_sendRequest($params);
  586.     }
  587.  
  588.     /**
  589.     * Retrieves the contents of a remote shopping cart
  590.     *
  591.     * @access public
  592.     * @param  string $cart_id A unique identifier for a cart
  593.     * @param  string $hmac A unique security token
  594.     * @param  array $options The optional parameters
  595.     * @return array The array of information returned by the query
  596.     * @see    CartAdd(), CartClear(), CartCreate(), CartModify()
  597.     */
  598.     function CartGet($cart_id$hmac$options = array())
  599.     {
  600.         $params $options;
  601.         $params['Operation''CartGet';
  602.         $params['CartId'$cart_id;
  603.         $params['HMAC'$hmac;
  604.         return $this->_sendRequest($params);
  605.     }
  606.  
  607.     /**
  608.     * Modifies the quantity of items in a cart and changes cart items to saved items
  609.     *
  610.     * Example:
  611.     * <code>
  612.     * <?php
  613.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  614.     * $item = array('CartItemId' => 'aaaaaaaaaa', 'Quantity' => 1);
  615.     * // $item = array('CartItemId' => 'aaaaaaaaaa', 'Action' => 'SaveForLater');
  616.     * // $item = array(array('CartItemId' => 'aaaaaaaaaa', 'Quantity' => 1),
  617.     * //               array('CartItemId' => 'cccccccccc', 'Quantity' => 20));
  618.     * $result = $amazon->CartModify('[Cart ID]', '[HMAC]', $item);
  619.     * ?>
  620.     * </code>
  621.     *
  622.     * @access public
  623.     * @param  string $cart_id A unique identifier for a cart
  624.     * @param  string $hmac A unique security token
  625.     * @param  array $item The CartItemId and the quantities or the Action
  626.     * @param  array $options The optional parameters
  627.     * @return array The array of information returned by the query
  628.     * @see    CartAdd(), CartClear(), CartCreate(), CartGet()
  629.     */
  630.     function CartModify($cart_id$hmac$item$options = array())
  631.     {
  632.         $params $options;
  633.         $params['Operation''CartModify';
  634.         $params['CartId'$cart_id;
  635.         $params['HMAC'$hmac;
  636.         $params += $this->_assembleItemParameter($item);
  637.         return $this->_sendRequest($params);
  638.     }
  639.  
  640.     /**
  641.     * Retrieves publicly available content written by specific Amazon customers
  642.     *
  643.     * @access public
  644.     * @param  string $customer_id A customer ID
  645.     * @param  array $options The optional parameters
  646.     * @return array The array of information returned by the query
  647.     * @see    CustomerContentSearch()
  648.     */
  649.     function CustomerContentLookup($customer_id$options = array())
  650.     {
  651.         $params $options;
  652.         $params['Operation''CustomerContentLookup';
  653.         $params['CustomerId'$customer_id;
  654.         return $this->_sendRequest($params);
  655.     }
  656.  
  657.     /**
  658.     * Searches for Amazon customers by name or email address
  659.     *
  660.     * @access public
  661.     * @param  array $customer A customer's name or its email
  662.     * @param  array $options The optional parameters
  663.     * @return array The array of information returned by the query
  664.     * @see    CustomerContentLookup()
  665.     */
  666.     function CustomerContentSearch($customer = null$options = array())
  667.     {
  668.         $params $options;
  669.         $params['Operation''CustomerContentSearch';
  670.         $params += $customer;
  671.         return $this->_sendRequest($params);
  672.     }
  673.  
  674.     /**
  675.     * Retrieves information about operations and response groups
  676.     *
  677.     * Example:
  678.     * <code>
  679.     * <?php
  680.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  681.     * $result = $amazon->Help('Operation', 'ItemLookup');
  682.     * ?>
  683.     * </code>
  684.     *
  685.     * @access public
  686.     * @param  string $help_type The type of information
  687.     * @param  string $about The name of an operation or a response group
  688.     * @param  array $options The optional parameters
  689.     * @return array The array of information returned by the query
  690.     */
  691.     function Help($help_type$about$options = array())
  692.     {
  693.         $params $options;
  694.         $params['Operation''Help';
  695.         $params['HelpType'$help_type;
  696.         $params['About'$about;
  697.         return $this->_sendRequest($params);
  698.     }
  699.         
  700.     /**
  701.     * Retrieves information for products
  702.     *
  703.     * Example:
  704.     * <code>
  705.     * <?php
  706.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  707.     * $options = array();
  708.     * $options['ResponseGroup'] = 'Large';
  709.     * $result = $amazon->ItemLookup('[ASIN(s)]', $options);
  710.     * ?>
  711.     * </code>
  712.     *
  713.     * @access public
  714.     * @param  string $item_id Product IDs
  715.     * @param  array $options The optional parameters
  716.     * @return array The array of information returned by the query
  717.     * @see    ItemSearch()
  718.     */
  719.     function ItemLookup($item_id$options = array())
  720.     {
  721.         $params $options;
  722.         $params['Operation''ItemLookup';
  723.         if (is_array($item_id)) {
  724.             $item_id implode(','$item_id);
  725.         }
  726.         $params['ItemId'$item_id;
  727.         return $this->_sendRequest($params);
  728.     }
  729.  
  730.     /**
  731.     * Searches for products
  732.     *
  733.     * Example:
  734.     * <code>
  735.     * <?php
  736.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  737.     * $options = array();
  738.     * $options['Keywords'] = 'sushi';
  739.     * $options['Sort'] = 'salesrank';
  740.     * $options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
  741.     * $result = $amazon->ItemSearch('Books', $options);
  742.     * ?>
  743.     * </code>
  744.     *
  745.     * @access public
  746.     * @param  string $search_index A search index
  747.     * @param  array $options The optional parameters
  748.     * @return array The array of information returned by the query
  749.     * @see    ItemLookup()
  750.     */
  751.     function ItemSearch($search_index$options = array())
  752.     {
  753.         $params $options;
  754.         $params['Operation''ItemSearch';
  755.         $params['SearchIndex'$search_index;
  756.         return $this->_sendRequest($params);
  757.     }
  758.  
  759.     /**
  760.     * Retrieves products in a specific list
  761.     *
  762.     * @access public
  763.     * @param  string $list_type The type of list
  764.     * @param  string $list_id A list ID
  765.     * @param  array $options The optional parameters
  766.     * @return array The array of information returned by the query
  767.     * @see    ListSearch()
  768.     */
  769.     function ListLookup($list_type$list_id$options = array())
  770.     {
  771.         $params $options;
  772.         $params['Operation''ListLookup';
  773.         $params['ListType'$list_type;
  774.         $params['ListId'$list_id;
  775.         return $this->_sendRequest($params);
  776.     }
  777.  
  778.     /**
  779.     * Searches for a wish list, baby registry, or wedding registry
  780.     *
  781.     * Example:
  782.     * <code>
  783.     * <?php
  784.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  785.     * $keywords = array('Name' => 'hoge');
  786.     * $result = $amazon->ListSearch('WishList', $keywords);
  787.     * ?>
  788.     * </code>
  789.     *
  790.     * @access public
  791.     * @param  string $list_type The type of list
  792.     * @param  array $keywords Parameters to search for
  793.     * @param  array $options The optional parameters
  794.     * @return array The array of information returned by the query
  795.     * @see    ListLookup()
  796.     */
  797.     function ListSearch($list_type$keywords$options = array())
  798.     {
  799.         $params $options;
  800.         $params['Operation''ListSearch';
  801.         $params['ListType'$list_type;
  802.         $params += $keywords;
  803.         return $this->_sendRequest($params);
  804.     }
  805.  
  806.     /**
  807.     * Retrieves information about Amazon zShops and Marketplace products
  808.     *
  809.     * @access public
  810.     * @param  string $id_type The type of ID
  811.     * @param  string $id The exchange ID or the listing ID
  812.     * @param  array $options The optional parameters
  813.     * @return array The array of information returned by the query
  814.     * @see    SellerListingSearch()
  815.     */
  816.     function SellerListingLookup($id_type$id$options = array())
  817.     {
  818.         $params $options;
  819.         $params['Operation''SellerListingLookup';
  820.         $params['IdType'$id_type;
  821.         $params['Id'$id;
  822.         return $this->_sendRequest($params);
  823.     }
  824.  
  825.     /**
  826.     * Searches for Amazon zShops and Marketplace products
  827.     *
  828.     * Example:
  829.     * <code>
  830.     * <?php
  831.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  832.     * $keywords = array('Keywords' => 'pizza');
  833.     * $result = $amazon->SellerListingSearch('zShops', $keywords);
  834.     * ?>
  835.     * </code>
  836.     *
  837.     * @access public
  838.     * @param  string $search_index The type of seller listings
  839.     * @param  array $options The optional parameters
  840.     * @return array The array of information returned by the query
  841.     * @see    SellerListingLookup()
  842.     */
  843.     function SellerListingSearch($search_index$options = array())
  844.     {
  845.         $params $options;
  846.         $params['Operation''SellerListingSearch';
  847.         $params['SearchIndex'$search_index;
  848.         return $this->_sendRequest($params);
  849.     }
  850.  
  851.     /**
  852.     * Retrieves information about specific sellers
  853.     *
  854.     * @access public
  855.     * @param  string $seller_id IDs for Amazon sellers
  856.     * @param  array $options The optional parameters
  857.     * @return array The array of information returned by the query
  858.     */
  859.     function SellerLookup($seller_id$options = array())
  860.     {
  861.         $params $options;
  862.         $params['Operation''SellerLookup';
  863.         $params['SellerId'$seller_id;
  864.         return $this->_sendRequest($params);
  865.     }
  866.  
  867.     /**
  868.     * Retrieves products that are similar to Amazon products
  869.     *
  870.     * @access public
  871.     * @param  string $item_id Product IDs
  872.     * @param  array $options The optional parameters
  873.     * @return array The array of information returned by the query
  874.     */
  875.     function SimilarityLookup($item_id$options = array())
  876.     {
  877.         $params $options;
  878.         $params['Operation''SimilarityLookup';
  879.         if (is_array($item_id)) {
  880.             $item_id implode(','$item_id);
  881.         }
  882.         $params['ItemId'$item_id;
  883.         return $this->_sendRequest($params);
  884.     }
  885.  
  886.     /**
  887.     * Retrieves information about the status of financial transactions
  888.     *
  889.     * @access public
  890.     * @param  string $transaction_id Transaction IDs
  891.     * @param  array $options The optional parameters
  892.     * @return array The array of information returned by the query
  893.     */
  894.     function TransactionLookup($transaction_id$options = array())
  895.     {
  896.         $params $options;
  897.         $params['Operation''TransactionLookup';
  898.         $params['TransactionId'$transaction_id;
  899.         return $this->_sendRequest($params);
  900.     }
  901.  
  902.     /**
  903.     * Combines requests for the same operation into a single request
  904.     *
  905.     * Example:
  906.     * <code>
  907.     * <?php
  908.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  909.     * $shared = array('SearchIndex' => 'Books',
  910.     *                 'Keywords' => 'php');
  911.     * $params1 = array('ItemPage' => '1');
  912.     * $params2 = array('ItemPage' => '2');
  913.     * $result = $amazon->doBatch('ItemSearch', $shared, $params1, $params2);
  914.     * ?>
  915.     * </code>
  916.     *
  917.     * @access public
  918.     * @param  string $operation The operation
  919.     * @param  array $shared Shared parameters
  920.     * @param  array $params1 The parameters specific to the first request
  921.     * @param  array $params2 The parameters specific to the second request
  922.     * @return array The array of information returned by the query
  923.     */
  924.     function doBatch($operation$shared$params1 = array()$params2 = array())
  925.     {
  926.         $params = array();
  927.         $params['Operation'$operation;
  928.         foreach ($shared as $k => $v{
  929.             $params[$operation '.Shared.' $k$v;
  930.         }
  931.         foreach ($params1 as $k => $v{
  932.             $params[$operation '.1.' $k$v;
  933.         }
  934.         foreach ($params2 as $k => $v{
  935.             $params[$operation '.2.' $k$v;
  936.         }
  937.         return $this->_sendRequest($params);
  938.     }
  939.  
  940.     /**
  941.     * Combines the different operations into a single request
  942.     *
  943.     * Example:
  944.     * <code>
  945.     * <?php
  946.     * $amazon = new Services_AmazonECS4('[your Access Key ID here]');
  947.     * $params1 = array('SearchIndex' => 'Books',
  948.     *                  'Title' => 'sushi');
  949.     * $params2 = array('Keywords' => 'tempura');
  950.     * $result = $amazon->doMultiOperation('ItemSearch', $params1,
  951.     *                                     'SellerListingSearch', $params2);
  952.     * ?>
  953.     * </code>
  954.     *
  955.     * @access public
  956.     * @param  string $operation1 The first operation
  957.     * @param  array $params1 The parameters specific to the first request
  958.     * @param  string $operation2 The second operation
  959.     * @param  array $params2 The parameters specific to the second request
  960.     * @return array The array of information returned by the query
  961.     */
  962.     function doMultiOperation($operation1$params1$operation2$params2)
  963.     {
  964.         $params = array();
  965.         $params['Operation'$operation1 ',' $operation2;
  966.         foreach ($params1 as $k => $v{
  967.             $params[$operation1 '.1.' $k$v;
  968.         }
  969.         foreach ($params2 as $k => $v{
  970.             $params[$operation2 '.1.' $k$v;
  971.         }
  972.         return $this->_sendRequest($params);
  973.     }
  974.  
  975.     /**
  976.     * Assembles the Item parameters
  977.     *
  978.     * @access private
  979.     * @param  array $items The items
  980.     * @return array The item parameters
  981.     */
  982.     function _assembleItemParameter($items)
  983.     {
  984.         $params = array();
  985.         if (!is_array(current($items))) {
  986.             $items = array(0 => $items);
  987.         }
  988.         $i = 1;
  989.         foreach ($items as $item{
  990.             foreach ($item as $k => $v{
  991.                 $params['Item.' $i '.' $k$v;
  992.             }
  993.             $i++;
  994.         }
  995.         return $params;
  996.     }
  997.  
  998.     /**
  999.     * Ignores the caching of specific operations
  1000.     *
  1001.     * @access private
  1002.     * @param  string $operation The operation
  1003.     * @return bool Returns true if the operation isn't cached, false otherwise
  1004.     */
  1005.     function _ignoreCache($operation)
  1006.     {
  1007.         $ignore = array('CartAdd''CartClear''CartGet''CartModify''TransactionLookup');
  1008.         if (!strchr($operation',')) {
  1009.             return in_array($operation$ignore);
  1010.         }
  1011.         $operations explode(','$operation);
  1012.         foreach ($operations as $v{
  1013.             if (in_array($v$ignore)) {
  1014.                 return true;
  1015.             }
  1016.         }
  1017.         return false;
  1018.     }
  1019.  
  1020.     /**
  1021.     * Generates ID used as cache identifier
  1022.     *
  1023.     * @access private
  1024.     * @param  array $params 
  1025.     * @return string Cache ID
  1026.     */
  1027.     function _generateCacheId($params)
  1028.     {
  1029.         unset($params['AWSAccessKeyId']);
  1030.         unset($params['AssociateTag']);
  1031.         $str '';
  1032.         foreach ($params as $k => $v{
  1033.             $str .= $k $v;
  1034.         }
  1035.         return md5($str);
  1036.     }
  1037.  
  1038.     /**
  1039.     * Builds a URL
  1040.     *
  1041.     * @access private
  1042.     * @param array $params 
  1043.     * @return string URL
  1044.     */
  1045.     function _buildUrl($params)
  1046.     {
  1047.         $params['AWSAccessKeyId'$this->_keyid;
  1048.         $params['AssociateTag'$this->_associd;
  1049.         $params['Version'$this->_version;
  1050.         $url $this->_baseurl;
  1051.         foreach ($params as $k => $v{
  1052.             $url .= '&' $k '=' urlencode($v);
  1053.         }
  1054.         return $url;
  1055.     }
  1056.  
  1057.     /**
  1058.     * Sends a request
  1059.     *
  1060.     * @access private
  1061.     * @param string $url 
  1062.     * @return string The response
  1063.     */
  1064.     function _sendHttpRequest($url)
  1065.     {
  1066.         $http &new HTTP_Request($url);
  1067.         $http->setHttpVer('1.0');
  1068.         $http->addHeader('User-Agent''Services_AmazonECS4/' $this->getApiVersion());
  1069.         if ($this->_proxy_host{
  1070.             $http->setProxy($this->_proxy_host$this->_proxy_port$this->_proxy_user$this->_proxy_pass);
  1071.         }
  1072.  
  1073.         $result $http->sendRequest();
  1074.         if (PEAR::isError($result)) {
  1075.             return PEAR::raiseError('HTTP_Request::sendRequest failed: ' $result->message);
  1076.         }
  1077.  
  1078.         if ($http->getResponseCode(!= 200){
  1079.             return PEAR::raiseError('Amazon returned invalid HTTP response code ' $http->getResponseCode());
  1080.         }
  1081.         return $http->getResponseBody();
  1082.     }
  1083.  
  1084.     /**
  1085.     * Parses raw XML result
  1086.     *
  1087.     * @access private
  1088.     * @param string $raw_result 
  1089.     * @return string The contents
  1090.     */
  1091.     function _parseRawResult($raw_result)
  1092.     {
  1093.         $xml &new XML_Unserializer();
  1094.         $xml->setOption(XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSEtrue);
  1095.         $xml->setOption(XML_UNSERIALIZER_OPTION_FORCE_ENUM,
  1096.                         array('Item''Review''EditorialReview',
  1097.                               'Parameter''Author''Creator''ResponseGroup''Error'));
  1098.         $xml->unserialize($raw_resultfalse);
  1099.         $data $xml->getUnserializedData();
  1100.         if (PEAR::isError($data)) {
  1101.             return $data;
  1102.         }
  1103.  
  1104.         if (isset($data['Error'])) {
  1105.             $this->_errors $data['Error'];
  1106.             return PEAR::raiseError(implode(':'$this->getError()));
  1107.         }
  1108.  
  1109.         if (isset($data['OperationRequest']['RequestProcessingTime'])) {
  1110.             $this->_processing_time $data['OperationRequest']['RequestProcessingTime'];
  1111.         }
  1112.  
  1113.         if (isset($data['OperationRequest']['Errors'])) {
  1114.             $this->_errors $data['OperationRequest']['Errors']['Error'];
  1115.             return PEAR::raiseError(implode(':'$this->getError()));
  1116.         }
  1117.  
  1118.         // Get values of the second level content elements
  1119.         unset($data['xmlns']);
  1120.         unset($data['OperationRequest']);
  1121.         $contents = array();
  1122.         $keys array_keys($data);
  1123.         foreach ($keys as $v{
  1124.             if (strstr($v'Response')) {
  1125.                 $data[$vcurrent($data[$v]);
  1126.                 $contents[$v$data[$v];
  1127.             else {
  1128.                 $contents $data[$v];
  1129.             }
  1130.             $result $this->_checkContentError($data[$v]);
  1131.             if (PEAR::isError($result)) {
  1132.                 return $result;
  1133.             }
  1134.         }
  1135.         return $contents;
  1136.     }
  1137.  
  1138.     /**
  1139.     * Checks error codes at the content elements
  1140.     *
  1141.     * @access private
  1142.     * @param  array $content Values of the content elements
  1143.     * @return array mixed A PEAR_Error on error, a true on success
  1144.     * @see    _parseRawResult
  1145.     */
  1146.     function _checkContentError($content)
  1147.     {
  1148.         if (isset($content['Request']['Errors'])) {
  1149.             $this->_errors $content['Request']['Errors']['Error'];
  1150.             return PEAR::raiseError(implode(':'$this->getError()));
  1151.         else if (isset($content[0])) {
  1152.             $errors = array();
  1153.             foreach ($content as $v{
  1154.                 if (isset($v['Request']['Errors']['Error'])) {
  1155.                     $errors array_merge($errors$v['Request']['Errors']['Error']);
  1156.                 }
  1157.             }
  1158.             if (!empty($errors)) {
  1159.                 $this->_errors $errors;
  1160.                 return PEAR::raiseError(implode(':'$this->getError()));
  1161.             }
  1162.         }
  1163.         return true;
  1164.     }
  1165.  
  1166.     /**
  1167.     * Sends the request to Amazon
  1168.     *
  1169.     * @access private
  1170.     * @param  array $params The array of request parameters
  1171.     * @return array The array of information returned by the query
  1172.     */
  1173.     function _sendRequest($params)
  1174.     {
  1175.         $this->_errors = array();
  1176.  
  1177.         if (is_null($this->_keyid)) {
  1178.             return PEAR::raiseError('Access Key ID have not been set');
  1179.         }
  1180.  
  1181.         $url $this->_buildUrl($params);
  1182.         $this->_lasturl $url;
  1183.         if (PEAR::isError($url)) {
  1184.             return $url;
  1185.         }
  1186.  
  1187.         // Return cached data if available
  1188.         $cache_id = false;
  1189.         if (isset($this->_cache&& !$this->_ignoreCache($params['Operation'])) {
  1190.             $cache_id $this->_generateCacheId($params);
  1191.             $cache $this->_cache->get($cache_id);
  1192.             if (!is_null($cache)) {
  1193.                 $this->_processing_time = 0;
  1194.                 return $cache;
  1195.             }
  1196.         }
  1197.  
  1198.         $result $this->_sendHttpRequest($url);
  1199.         $this->_raw_result $result;
  1200.         if (PEAR::isError($result)) {
  1201.             return $result;
  1202.         }
  1203.  
  1204.         $contents $this->_parseRawResult($result);
  1205.         if (PEAR::isError($contents)) {
  1206.             return $contents;
  1207.         }
  1208.  
  1209.         if ($cache_id{
  1210.             $this->_cache->save($cache_id$contents$this->_cache_expire);
  1211.         }
  1212.  
  1213.         return $contents;
  1214.     }
  1215.  
  1216. }
  1217. ?>

Documentation generated on Mon, 11 Mar 2019 15:46:56 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.