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

Source for file Session.php

Documentation is available at Session.php

  1. <?PHP
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2002 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Stephan Schmidt <schst@php.net>                             |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id$
  20.  
  21. /**
  22.  * Services/Ebay/Session.php
  23.  *
  24.  * manages IDs, authentication, serialization, etc.
  25.  *
  26.  * @package  Services_Ebay
  27.  * @author   Stephan Schmidt <schst@php.net>
  28.  */
  29. {
  30.    /**
  31.     * Debugging disabled
  32.     */
  33.     const DEBUG_NONE = 0;
  34.  
  35.    /**
  36.     * Store debug data, so it can be displayed using getWire()
  37.     */
  38.     const DEBUG_STORE = 1;
  39.  
  40.    /**
  41.     * Display debug data
  42.     */
  43.     const DEBUG_PRINT = 2;
  44.  
  45.    /**
  46.     * Sandbox gateway URL
  47.     */
  48.     const URL_SANDBOX = 'https://api.sandbox.ebay.com/ws/api.dll';
  49.  
  50.    /**
  51.     * Production gateway URL
  52.     */
  53.     const URL_PRODUCTION = 'https://api.ebay.com/ws/api.dll';
  54.  
  55.    /**o
  56.     * developer ID
  57.     *
  58.     * If you do not already have one, please
  59.     * apply for a developer ID at http://developer.ebay.com
  60.     *
  61.     * @var string
  62.     */
  63.     private $devId;
  64.     
  65.    /**
  66.     * application id
  67.     *
  68.     * @var string 
  69.     */
  70.     private $appId;
  71.  
  72.    /**
  73.     * application id
  74.     *
  75.     * @var certificate ID
  76.     */
  77.     private $certId;
  78.     
  79.    /**
  80.     * Auth & Auth token
  81.     *
  82.     * @var string 
  83.     */
  84.     private $token;
  85.  
  86.    /**
  87.     * auth username
  88.     *
  89.     * @var string 
  90.     */
  91.     private $requestUserId;
  92.  
  93.    /**
  94.     * auth password
  95.     *
  96.     * @var string 
  97.     */
  98.     private $requestPassword;
  99.  
  100.     /**
  101.     * name of the transport driver to use
  102.     *
  103.     * @var string 
  104.     */
  105.     private $transportDriver 'Curl';
  106.  
  107.    /**
  108.     * transport driver
  109.     *
  110.     * @var  object Services_Ebay_Transport 
  111.     */
  112.     private $transport;
  113.     
  114.    /**
  115.     * URL to use
  116.     *
  117.     * By default, the sandbox URL is used.
  118.     *
  119.     * @var  string 
  120.     */
  121.     private $url;
  122.  
  123.    /**
  124.     * site id
  125.     *
  126.     * @var  integer 
  127.     */
  128.     private $siteId = 0;
  129.  
  130.    /**
  131.     * Session options
  132.     *
  133.     * @var  array 
  134.     */
  135.     private $opts;
  136.  
  137.    /**
  138.     * XML_Serializer object
  139.     *
  140.     * @var object XML_Serializer 
  141.     */
  142.     private $ser;
  143.  
  144.    /**
  145.     * XML_Unserializer object
  146.     *
  147.     * @var object XML_Unserializer 
  148.     */
  149.     private $us;
  150.     
  151.    /**
  152.     * debug flag
  153.     *
  154.     * @var boolean 
  155.     */
  156.     public $debug = 1;
  157.     
  158.    /**
  159.     * XML wire
  160.     *
  161.     * @var string 
  162.     */
  163.     public $wire = null;
  164.     
  165.    /**
  166.     * compatibility level
  167.     *
  168.     * @var       integer 
  169.     */
  170.     public $compatLevel = 405;
  171.  
  172.    /**
  173.     * detail level
  174.     *
  175.     * @var  string 
  176.     */
  177.     public $detailLevel;
  178.  
  179.    /**
  180.     * general warning Level
  181.     *
  182.     * @var  int 
  183.     */
  184.     private $warningLevel 'High';
  185.  
  186.    /**
  187.     * error language
  188.     *
  189.     * @var  int 
  190.     */
  191.     private $errorLanguage 'en_US';
  192.  
  193.    /**
  194.     * additional options for the serializer
  195.     *
  196.     * These options will be set by the call objects
  197.     *
  198.     * @var  array 
  199.     */
  200.     private $serializerOptions = array();
  201.  
  202.    /**
  203.     * additional options for the unserializer
  204.     *
  205.     * These options will be set by the call objects
  206.     *
  207.     * @var  array 
  208.     */
  209.     private $unserializerOptions = array();
  210.  
  211.    /**
  212.     * errors returned by the webservice
  213.     *
  214.     * @var array 
  215.     */
  216.     private $errors = array();
  217.     
  218.    /**
  219.     * create the session object
  220.     *
  221.     * @param    string  developer id
  222.     * @param    string  application id
  223.     * @param    string  certificate id
  224.     * @param    string  external encoding, as eBay uses UTF-8, the session will encode and decode to
  225.     *                    the specified encoding. Possible values are ISO-8859-1 and UTF-8
  226.     */
  227.     public function __construct($devId$appId$certId$encoding 'ISO-8859-1')
  228.     {
  229.         $this->devId $devId;
  230.         $this->appId $appId;
  231.         $this->certId $certId;
  232.         $this->url = self::URL_SANDBOX;
  233.         
  234.         $this->opts = array(
  235.                                 'indent'             => '  ',
  236.                                 'linebreak'          => "\n",
  237.                                 'typeHints'          => false,
  238.                                 'addDecl'            => true,
  239.                                 'encoding'           => 'UTF-8',
  240.                                 'scalarAsAttributes' => false
  241.                            );
  242.         // UTF-8 encode the document, if the user does not already
  243.         // use UTF-8 encoding
  244.         if ($encoding !== 'UTF-8'{
  245.             $opts['encodeFunction''utf8_encode';
  246.         }
  247.  
  248.         $opts = array(
  249.                     'forceEnum'      => array('Error'),
  250.                     'encoding'       => 'UTF-8',
  251.                     'targetEncoding' => $encoding,
  252.                     );
  253.         $this->us  = new XML_Unserializer($opts);
  254.     }
  255.  
  256.    /**
  257.     * set the debug mode
  258.     *
  259.     * Possible values are:
  260.     * - Services_Ebay_Session::DEBUG_NONE
  261.     * - Services_Ebay_Session::DEBUG_STORE
  262.     * - Services_Ebay_Session::DEBUG_PRINT
  263.     *
  264.     * @param    integer 
  265.     * @see      getWire()
  266.     */
  267.     public function setDebug($debug)
  268.     {
  269.         $this->debug = $debug;
  270.     }
  271.  
  272.    /**
  273.     * get the XML code that was sent accross the network
  274.     *
  275.     * To use this, debug mode must be set to DEBUG_STORE or DEBUG_PRINT
  276.     *
  277.     * @return   string      xml wire
  278.     */
  279.     public function getWire()
  280.     {
  281.         return $this->wire;
  282.     }
  283.  
  284.    /**
  285.     * set the authentication token
  286.     *
  287.     * @param    string 
  288.     */
  289.     public function setToken($token)
  290.     {
  291.         $this->token $token;
  292.     }
  293.  
  294.    /**
  295.     * set the authentication username and password
  296.     *
  297.     * @param    string 
  298.     */
  299.     public function setAuthenticationData($username$password = null)
  300.     {
  301.         $this->requestUserId   $username;
  302.         $this->requestPassword $password;
  303.     }
  304.  
  305.    /**
  306.     * set the API URL
  307.     *
  308.     * @param    string 
  309.     *
  310.     *  Possible values are:
  311.     *  - Services_Ebay_Session::URL_SANDBOX
  312.     *  - Services_Ebay_Session::URL_PRODUCTION
  313.     *  - Other URLs as applicable
  314.     *
  315.     */
  316.     public function setUrl($url)
  317.     {
  318.        $this->url $url;
  319.     }
  320.  
  321.    /**
  322.     * set the site id
  323.     *
  324.     * @param    integer 
  325.     */
  326.     public function setSiteId($siteId)
  327.     {
  328.        $this->siteId $siteId;
  329.     }
  330.  
  331.    /**
  332.     * set the detail level
  333.     *
  334.     * @param    integer 
  335.     */
  336.     public function setDetailLevel($level)
  337.     {
  338.         $this->detailLevel = $level;
  339.     }
  340.     
  341.    /**
  342.     * set the error language
  343.     *
  344.     * @param    string 
  345.     */
  346.     public function setErrorLanguage($language)
  347.     {
  348.        $this->errorLanguage $language;
  349.     }
  350.  
  351.    /**
  352.     * build XML code for a request
  353.     *
  354.     * @access   private
  355.     * @param    string      verb of the request
  356.     * @param    array|null parameters of the request
  357.     * @return   string      XML request
  358.     */
  359.     public function buildRequestBody$verb$params = array()$authType = Services_Ebay::AUTH_TYPE_TOKEN )
  360.     {
  361.         $this->opts['rootName'$verb.'Request';
  362.         $this->opts['rootAttributes'= array'xmlns' => 'urn:ebay:apis:eBLBaseComponents' );
  363.         $this->ser = new XML_Serializer($this->opts);
  364.  
  365.         $request = array(
  366.                             'ErrorLanguage'     => $this->errorLanguage,
  367.                             'Version'           => $this->compatLevel,
  368.                             'WarningLevel'      => $this->warningLevel
  369.                         );
  370.         if (!is_null($this->detailLevel)) {
  371.             $request['DetailLevel'$this->detailLevel;
  372.         }
  373.  
  374.         switch ($authType{
  375.             case Services_Ebay::AUTH_TYPE_TOKEN:
  376.                 if (empty($this->token)) {
  377.                     throw new Services_Ebay_Auth_Exception('No authentication token set.');
  378.                 }
  379.                 $request['RequesterCredentials']['eBayAuthToken'$this->token;
  380.                 break;
  381.             case Services_Ebay::AUTH_TYPE_USER:
  382.                 if (empty($this->requestUserId|| empty($this->requestPassword)) {
  383.                     throw new Services_Ebay_Auth_Exception('No authentication data (username and password) set.');
  384.                 }
  385.                 $request['RequesterCredentials']['Username']   $this->requestUserId;
  386.                 $request['RequesterCredentials']['Password']   $this->requestPassword;
  387.                 break;
  388.             case Services_Ebay::AUTH_TYPE_NONE:
  389.                 if (empty($this->requestUserId)) {
  390.                     throw new Services_Ebay_Auth_Exception('No username has been set.');
  391.                 }
  392.                 $request['RequesterCredentials']['Username']   $this->requestUserId;
  393.                 break;
  394.         }
  395.  
  396.         $request array_merge($request$params);
  397.  
  398.         $this->ser->serialize($request$this->serializerOptions);
  399.  
  400.         return $this->ser->getSerializedData();
  401.     }
  402.  
  403.    /**
  404.     * send a request
  405.     *
  406.     * This method is used by the API methods. You
  407.     * may call it directly to access any eBay function that
  408.     * is not yet implemented.
  409.     *
  410.     * @access   public
  411.     * @param    string      function to call
  412.     * @param    array       associative array containing all parameters for the function call
  413.     * @param    integer     authentication type
  414.     * @param    boolean     flag to indicate, whether XML should be parsed or returned raw
  415.     * @return   array       response
  416.     * @todo     add real error handling
  417.     */
  418.     public function sendRequest$verb$params = array()$authType = Services_Ebay::AUTH_TYPE_TOKEN$parseResult = true )
  419.     {
  420.         $this->wire = '';
  421.  
  422.         if (!isset($params['ErrorLanguage']&& !is_null($this->errorLanguage)) {
  423.             $params['ErrorLanguage'$this->errorLanguage;
  424.         }
  425.  
  426.         if (!isset($params['WarningLevel']&& !is_null($this->warningLevel)) {
  427.             $params['WarningLevel'$this->warningLevel;
  428.         }
  429.  
  430.         $body    $this->buildRequestBody($verb$params$authType);
  431.         
  432.         $headers = array(
  433.                             'X-EBAY-API-SESSION-CERTIFICATE' => sprintf'%s;%s;%s'$this->devId$this->appId$this->certId ),      // Required. Used to authenticate the function call. Use this format, where DevId is the same as the value of the X-EBAY-API-DEV-NAME header, AppId is the same as the value of the X-EBAY-API-APP-NAME header, and CertId  is the same as the value of the X-EBAY-API-CERT-NAME header: DevId;AppId;CertId
  434.                             'X-EBAY-API-COMPATIBILITY-LEVEL' => $this->compatLevel,                                                 // Required. Regulates versioning of the XML interface for the API.
  435.                             'X-EBAY-API-DEV-NAME'            => $this->devId,                                                       // Required. Developer ID, as registered with the Developer's Program. This value should match the first value (DevId) in the X-EBAY-API-SESSION-CERTIFICATE header. Used to authenticate the function call.
  436.                             'X-EBAY-API-APP-NAME'            => $this->appId,                                                       // Required. Application ID, as registered with the Developer's Program. This value should match the second value (AppId) in the X-EBAY-API-SESSION-CERTIFICATE header. Used to authenticate the function call.
  437.                             'X-EBAY-API-CERT-NAME'           => $this->certId,                                                      // Required. Certificate ID, as registered with the Developer's Program. This value should match the third value (CertId) in the X-EBAY-API-SESSION-CERTIFICATE header. Used to authenticate the function call.
  438.                             'X-EBAY-API-CALL-NAME'           => $verb,                                                              // Required. Name of the function being called, for example: 'GetItem' (without the quotation marks). This must match the information passed in the Verb input argument for each function.
  439.                             'X-EBAY-API-SITEID'              => $this->siteId,                                                      // Required. eBay site an item is listed on or that a user is registered on, depending on the purpose of the function call. This must match the information passed in the SiteId input argument for all functions.
  440.                             'Content-Type'                   => 'text/xml',                                                         // Required. Specifies the kind of data being transmitted. The value must be 'text/xml'. Sending any other value (e.g., 'application/x-www-form-urlencoded') may cause the call to fail.
  441.                             'Content-Length'                 => strlen$body )                                                     // Recommended. Specifies the size of the data (i.e., the length of the XML string) you are sending. This is used by eBay to determine how much data to read from the stream.
  442.                         );
  443.  
  444.         $file  SERVICES_EBAY_BASEDIR.'/Ebay/Transport/'.$this->transportDriver.'.php';
  445.         $class 'Services_Ebay_Transport_'.$this->transportDriver;
  446.  
  447.         @include_once $file;
  448.         if (!class_exists($class)) {
  449.             throw new Services_Ebay_Transport_Exception('Could not load selected transport driver.');            
  450.         }
  451.         $tp = new $class();
  452.         
  453.         if ($this->debug > 0{
  454.             $this->wire .= "Sending request:\n";
  455.             $this->wire .= $body."\n\n";
  456.         }
  457.  
  458.         $response $tp->sendRequest($this->url$body$headers);
  459.  
  460.         if (PEAR::isError($response)) {
  461.             return $response;
  462.         }
  463.         
  464.         if ($this->debug > 0{
  465.             $this->wire .= "Received response:\n";
  466.             $this->wire .= $response."\n\n";
  467.         }
  468.  
  469.         if ($this->debug > 1{
  470.             echo $this->wire . "\n";
  471.         }
  472.         
  473.         if ($parseResult === false{
  474.             return $response;
  475.         }
  476.  
  477.         $this->us->unserialize$responsefalse$this->unserializerOptions );
  478.         $result $this->us->getUnserializedData();
  479.  
  480.         $errors = array();
  481.         
  482.         if (isset($result['Ack']&& $result['Ack'== 'Failure'{
  483.             if (isset($result['Errors'])) {
  484.                 if (isset($result['Errors'][0])) {
  485.                     foreach ($result['Errors'as $error{
  486.                         $tmp = new Services_Ebay_Error($error);
  487.  
  488.                         // last errors
  489.                         array_push($errors$tmp);
  490.  
  491.                         // all errors
  492.                         array_push($this->errors$tmp);
  493.                     }
  494.                 else {
  495.                     $error = array();
  496.                     foreach ($result['Errors'as $key=>$value{
  497.                         $error[$key$value;
  498.                     }
  499.                     $tmp = new Services_Ebay_Error($error);
  500.  
  501.                     array_push($errors$tmp);
  502.                     array_push($this->errors$tmp);
  503.                 }
  504.  
  505.                 // check for serious errors
  506.                 $message '';
  507.                 $severe  = array();
  508.                 foreach ($errors as $error{
  509.                     if ($error->getSeverityCode(== 'Warning'{
  510.                         continue;
  511.                     }
  512.                     $message .= $error->getLongMessage();
  513.                     $message .= "\n";
  514.                     array_push($severe$error);
  515.                 }
  516.                 if (!empty($severe)) {
  517.                     throw new Services_Ebay_API_Exception($message$severe);
  518.                 }
  519.             else {
  520.                 throw new Services_Ebay_API_Exception('Unknown error occured.');
  521.             }
  522.         }
  523.         return $result;
  524.     }
  525.  
  526.    /**
  527.     * get the errors and warnings that happened during the
  528.     * last API calls
  529.     *
  530.     * @param  boolean   whether to clear the internal error list
  531.     * @return array 
  532.     */
  533.     public function getErrors($clear = true)
  534.     {
  535.         $errors $this->errors;
  536.         if ($clear === true{
  537.             $this->errors = array();
  538.         }
  539.         return $errors;
  540.     }
  541.     
  542.    /**
  543.     * set additional options for the serializer
  544.     *
  545.     * @param    array 
  546.     */
  547.     public function setSerializerOptions($opts = array())
  548.     {
  549.         $this->serializerOptions $opts;
  550.     }
  551.  
  552.    /**
  553.     * set additional options for the unserializer
  554.     *
  555.     * @param    array 
  556.     */
  557.     public function setUnserializerOptions($opts = array())
  558.     {
  559.         $this->unserializerOptions $opts;
  560.     }
  561.  
  562.    /**
  563.     * set compatibility level if particular request needs
  564.     * another version of API instead of default one
  565.     *
  566.     * @param    int 
  567.     */
  568.     public function setCompatLevel($compatLevel)
  569.     {
  570.         $this->compatLevel = $compatLevel;
  571.     }
  572. }
  573. ?>

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