/** * Returns transaction status * * @param Order $order Customer order * @param Customer $customer * @param Method $method Payment method * @param string $reference Order reference * @param boolean $extended Always query extended data * @return Response * @throws GatewayException */ public function getStatus(Order $order, Customer $customer, Method $method, $reference = '', $extended = false) { // Try to get reference from URL if (!$reference) { $reference = filter_input(INPUT_GET, 'dts_reference'); } if (!$reference) { throw new GatewayException('Reference required.'); } // Perform initial query $query = new Query(Query::TYPE_INFO, $reference, $method, $order); $result = $this->processOperation($query); if ($method instanceof Payment\PayPal) { if ($result->isWaitingSubmission()) { $attempt_ref = $result->getReference(); $attempt = new Attempt($attempt_ref, $reference, $order, $customer); $submission = $this->processOperation($attempt); if (!$submission->isSuccess()) { $this->logEvent(LogLevel::ERROR, 'PayPal order submission failed - ' . $submission->getMessage()); return $submission; } $order->setRetry(uniqid()); return $this->getStatus($order, $customer, $method, $reference); } return $result; } $status = $result->getStatus(); if ($status !== false && !$extended) { return $result; } $extRef = $result->getExtendedReference(); // No reference available, return what we got already if (!$extRef) { return $result; } return $this->processOperation(new Query(Query::TYPE_EXTENDED, $extRef, $method, $order)); }