/** * Show the special page */ protected function handleRequest() { $req = $this->getRequest(); // TODO: Don't do that. $fake = $req->getBool('fake'); $fail = $req->getBool('fail'); if ($fake) { if ($fail) { $this->displayFailPage(); return; } else { $go = ResultPages::getThankYouPage($this->adapter); } $this->getOutput()->addHTML("<br>Redirecting to page {$go}"); $this->getOutput()->redirect($go); return; } $forbidden = false; $this->qs_oid = $req->getText('order_id', ''); $this->qs_ref = $req->getText('REF', ''); if ($this->qs_oid === '' && $this->qs_ref === '') { $forbidden = true; $f_message = 'No order ID in the Querystring.'; } else { $result = $this->popout_if_iframe(); if ($result) { return; } } $session_oid = $this->adapter->session_getData('Donor', 'order_id'); if (is_null($session_oid) || $this->qs_oid !== $session_oid && strpos($this->qs_ref, (string) $session_oid) === false) { $forbidden = true; $f_message = "Requested order id not present in the session. (session_oid = '{$session_oid}')"; } if ($forbidden) { $this->logger->error($this->qs_oid . " Resultswitcher: forbidden for reason: {$f_message}"); wfHttpError(403, 'Forbidden', wfMessage('donate_interface-error-http-403')->text()); return; } $this->setHeaders(); $this->logger->info("Resultswitcher: OK to process Order ID: " . $this->qs_oid); // dispatch forms/handling if ($this->adapter->checkTokens()) { // Display form for the first time //this next block is for credit card coming back from GC. Only that. Nothing else, ever. if ($this->adapter->getData_Unstaged_Escaped('payment_method') === 'cc') { $sessionOrders = $req->getSessionData('order_status'); if (!is_array($sessionOrders) || !isset($sessionOrders[$this->qs_oid]) || !is_array($sessionOrders[$this->qs_oid])) { $result = $this->adapter->do_transaction('Confirm_CreditCard'); $session_info = array('data' => $result->getData(), 'message' => $result->getMessage(), 'errors' => $result->getErrors()); $sessionOrders[$this->qs_oid] = $session_info; $sessionOrders[$this->qs_oid]['data']['count'] = 0; } else { $sessionOrders = $req->getSessionData('order_status'); $sessionOrders[$this->qs_oid]['data']['count'] = $sessionOrders[$this->qs_oid]['data']['count'] + 1; $this->logger->error("Resultswitcher: Multiple attempts to process. " . $sessionOrders[$this->qs_oid]['data']['count']); $result = new PaymentTransactionResponse(); $result->setData($sessionOrders[$this->qs_oid]['data']); $result->setMessage($sessionOrders[$this->qs_oid]['message']); $result->setErrors($sessionOrders[$this->qs_oid]['errors']); } $req->setSessionData('order_status', $sessionOrders); $this->displayResultsForDebug($result); //do the switching between the... stuff. $status = $this->adapter->getFinalStatus(); if ($status) { switch ($status) { case FinalStatus::COMPLETE: case FinalStatus::PENDING: case FinalStatus::PENDING_POKE: $this->logger->info("Displaying thank you page for final status {$status}"); $go = ResultPages::getThankYouPage($this->adapter); break; case FinalStatus::FAILED: $this->logger->info('Displaying fail page for final status failed.'); $this->displayFailPage(); return; } if ($go) { $this->getOutput()->addHTML("<br>Redirecting to page {$go}"); $this->getOutput()->redirect($go); return; } else { $this->logger->error("Resultswitcher: No redirect defined. Order ID: {$this->qs_oid}"); } } else { $this->logger->error("Resultswitcher: No FinalStatus. Order ID: {$this->qs_oid}"); } } else { $this->logger->error("Resultswitcher: Payment method is not cc. Order ID: {$this->qs_oid}"); } } else { $this->logger->error("Resultswitcher: Token Check Failed. Order ID: {$this->qs_oid}"); } $this->displayFailPage(); }