/** * Проверяем ответ от PayQR на отправленный запрос в PayQR */ public function check_response($rawResponse, $method, $url, $vars) { $message = "Method: {$method}\nUrl: {$url}\nParams: " . var_export($vars, true) . "\nResponse: {$rawResponse}"; PayqrLog::log($message); if ($rawResponse) { $this->trim_headers($rawResponse); } else { $error = curl_errno($this->request) . ' - ' . curl_error($this->request); throw new PayqrExeption("Ошибка при запросе {$method}, {$url}, " . var_export($vars, true) . ", {$error}", 0, $rawResponse); } // Проверяем что ответ не пустой if (empty($this)) { throw new PayqrExeption("Получен пустой ответ", 0); } // Проверяем код ответа if (!isset($this->headers['Status-Code'])) { throw new PayqrExeption("Отсутствует заголовок с кодом ответа " . var_export($this, true), 0, $this); } // Проверяем код ответа if ($this->headers['Status-Code'] != '200') { throw new PayqrExeption("Получен ответ с кодом ошибки " . $this->headers['Status-Code'] . " " . var_export($this, true), 0, $this); } // Проверяем заголовок ответа if (!PayqrAuth::checkHeader(PayqrConfig::$secretKeyIn, $this->headers)) { throw new PayqrExeption("Неверный параметр ['PQRSecretKey'] в headers ответа" . var_export($this, true), 0, $this); } return $this; }
/** * Получаем уведомление */ public function receive() { // Получаем данные из тела запроса $json = file_get_contents('php://input'); // логируем тело запроса PayqrLog::log("REQUEST\n" . $json); // Проверяем валидность JSON данных PayqrJsonValidator::validate($json); // Получаем объект события из уведомления $this->objectEvent = json_decode($json); // Проверяем что уведомление действительно от PayQR (по секретному ключу SecretKeyIn) if (!PayqrAuth::checkHeader(PayqrConfig::$secretKeyIn)) { // если уведомление пришло не от PayQR, вызываем исключение throw new PayqrExeption("Неверный параметр ['PQRSecretKey'] в header уведомления", 1); } // Проверяем наличие свойства типа объекта if (!isset($this->objectEvent->object) || !isset($this->objectEvent->id) || !isset($this->objectEvent->type)) { throw new PayqrExeption("В уведомлении отстутствуют обязательные параметры object, id, type", 1, $json); } $this->event = $this->objectEvent->type; $this->type = $this->objectEvent->data->object; PayqrLog::log("Тип события: " . $this->event . "\nИдентификатор события: " . $this->objectEvent->data->id); // В зависимости от того какого типа уведомление, создаем объект switch ($this->type) { case self::INVOICE: $this->objectHandler = new PayqrInvoice($this->objectEvent); break; case self::REVERT: $this->objectHandler = new PayqrRevert($this->objectEvent); break; case self::OFFER: $this->objectHandler = new PayqrOffer($this->objectEvent); break; case self::RECEIPT: $this->objectHandler = new PayqrReceipt($this->objectEvent); break; default: throw new PayqrExeption("В уведомлении отстутствуют обязательные параметры object id type", 1, $json); return; } // если все прошло успешно, возвращаем объект return $this->objectHandler; }