/**
  * Конструктор
  *
  * @param string           $error       Ошибка
  * @param string           $description Описание ошибки
  * @param Pro_Api_Dialogue $dialogue    Диалог
  */
 public function __construct($error, $description, Pro_Api_Dialogue $dialogue = null)
 {
     $this->error = $error;
     $this->dialogue = $dialogue;
     $this->description = $description;
     parent::__construct($error, $dialogue ? $dialogue->getHttpCode() : 500);
 }
Exemple #2
0
 /**
  * Выполнить запрос
  *
  * @param string       $url        Адрес API метода
  * @param mixed        $parameters Параметры запроса
  * @param string|null  $method     HTTP метод запроса
  * @param boolean|null $debug      Режим отладки
  *
  * @return Pro_Api_Dialogue
  */
 private function executeRequest($url, array $parameters = array(), $method = self::HTTP_GET, $debug = self::DEFAULT_DEBUG_MODE)
 {
     // параметры из url передаются в список параметров
     if (strpos($url, '?') !== false) {
         list($url, $url_params) = explode('?', $url, 2);
         parse_str($url_params, $url_params);
         $parameters = $url_params + $parameters;
     }
     $curl_options = array(CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_FOLLOWLOCATION => true, CURLOPT_URL => $url);
     // в режиме отладки сохраняем заголовки
     if ($debug) {
         $curl_options[CURLINFO_HEADER_OUT] = true;
         $curl_options[CURLOPT_HEADER] = true;
     }
     switch ($method) {
         case self::HTTP_GET:
             $url .= '?' . http_build_query($parameters);
             $curl_options[CURLOPT_URL] = $url;
             break;
         case self::HTTP_POST:
             $curl_options[CURLOPT_POST] = true;
         case self::HTTP_PUT:
         case self::HTTP_DELETE:
             $curl_options[CURLOPT_POSTFIELDS] = http_build_query($parameters);
             break;
         default:
             throw new Pro_Api_Exception('no_support_method', 'Неподдерживаемый метод запроса', null);
     }
     $ch = curl_init();
     curl_setopt_array($ch, $curl_options);
     $dialogue = new Pro_Api_Dialogue(curl_exec($ch), $ch, $url, $parameters, $debug);
     curl_close($ch);
     $json_decode = $dialogue->getJsonDecode();
     if ($dialogue->getHttpCode() != 200) {
         $code = $dialogue->getHttpCode();
         $desc = 'Неизвестная ошибка';
         if (isset($json_decode['error'], $json_decode['description'])) {
             $code = $json_decode['error'];
             $desc = $json_decode['description'];
             // токен устарел
             if ($code == 'invalid_token') {
                 $this->refreshAccessToken();
                 $parameters[self::NAME_ACCESS_TOKEN] = $token;
                 return $this->executeRequest($url, $parameters, $method, $debug);
             }
             // токен не найден
             if ($code == 'undefined_token') {
                 $this->access_token = null;
                 $this->access_token_expires = null;
             }
         } elseif (isset($json_decode['code'], $json_decode['error'])) {
             $code = $json_decode['code'];
             $desc = $json_decode['error'];
         }
         throw new Pro_Api_Exception($code, $desc, $dialogue);
     }
     return $dialogue;
 }