public function execute() { $active = null; // check if 3d is active $order = $this->_getOrder(); if ($order->getPayment()) { $active = $order->getPayment()->getAdditionalInformation('3dActive'); } // check if 3D secure is active. If not just go to success page if ($active) { $this->_adyenLogger->addAdyenResult("3D secure is active"); // check if it is already processed if ($this->getRequest()->isPost()) { $this->_adyenLogger->addAdyenResult("Process 3D secure payment"); $requestMD = $this->getRequest()->getPost('MD'); $requestPaRes = $this->getRequest()->getPost('PaRes'); $md = $order->getPayment()->getAdditionalInformation('md'); if ($requestMD == $md) { $order->getPayment()->setAdditionalInformation('paResponse', $requestPaRes); try { $result = $order->getPayment()->getMethodInstance()->authorise3d($order->getPayment()); } catch (Exception $e) { $result = 'Refused'; } // check if authorise3d was successful if ($result == 'Authorised') { $order->addStatusHistoryComment(__('3D-secure validation was successful'))->save(); $this->_redirect('checkout/onepage/success'); } else { $order->addStatusHistoryComment(__('3D-secure validation was unsuccessful.'))->save(); $this->_adyenHelper->cancelOrder($order); } } } else { $this->_adyenLogger->addAdyenResult("Customer was redirected to bank for 3D-secure validation."); $order->addStatusHistoryComment(__('Customer was redirected to bank for 3D-secure validation.'))->save(); $this->_view->loadLayout(); $this->_view->getLayout()->initMessages(); $this->_view->renderLayout(); } } else { $this->_redirect('checkout/onepage/success/'); } }
/** * Validate checksum from result parameters * * @param $response * @return bool */ protected function _validateChecksum($response) { $checksum = $response['cs']; $result = $response['result']; $amount = $response['originalCustomAmount']; $currency = $response['originalCustomCurrency']; $sessionId = $response['sessionId']; // for android sessionis is with low i if ($sessionId == "") { $sessionId = $response['sessionid']; } // calculate amount checksum $amountChecksum = 0; $amountLength = strlen($amount); for ($i = 0; $i < $amountLength; $i++) { // ASCII value use ord $checksumCalc = ord($amount[$i]) - 48; $amountChecksum += $checksumCalc; } $currencyChecksum = 0; $currencyLength = strlen($currency); for ($i = 0; $i < $currencyLength; $i++) { $checksumCalc = ord($currency[$i]) - 64; $currencyChecksum += $checksumCalc; } $resultChecksum = 0; $resultLength = strlen($result); for ($i = 0; $i < $resultLength; $i++) { $checksumCalc = ord($result[$i]) - 64; $resultChecksum += $checksumCalc; } $sessionIdChecksum = 0; $sessionIdLength = strlen($sessionId); for ($i = 0; $i < $sessionIdLength; $i++) { $checksumCalc = $this->_getAscii2Int($sessionId[$i]); $sessionIdChecksum += $checksumCalc; } $totalResultChecksum = ($amountChecksum + $currencyChecksum + $resultChecksum) * $sessionIdChecksum % 100; // check if request is valid if ($totalResultChecksum == $checksum) { $this->_adyenLogger->addAdyenResult('Checksum is valid'); return true; } $this->_adyenLogger->addAdyenResult('Checksum is invalid!'); return false; }
/** * @param $order * @param $params */ protected function _validateUpdateOrder($order, $response) { $result = false; $this->_adyenLogger->addAdyenResult('Updating the order'); $authResult = $response['authResult']; $paymentMethod = isset($response['paymentMethod']) ? trim($response['paymentMethod']) : ''; $pspReference = isset($response['pspReference']) ? trim($response['pspReference']) : ''; $type = 'Adyen Result URL response:'; $comment = __('%1 <br /> authResult: %2 <br /> pspReference: %3 <br /> paymentMethod: %4', $type, $authResult, $pspReference, $paymentMethod); $history = $this->_orderHistoryFactory->create()->setComment($comment)->setEntityName('order')->setOrder($order); $history->save(); // needed becuase then we need to save $order objects $order->setAdyenResulturlEventCode($authResult); switch ($authResult) { case \Adyen\Payment\Model\Notification::AUTHORISED: case \Adyen\Payment\Model\Notification::PENDING: // do nothing wait for the notification $result = true; $this->_adyenLogger->addAdyenResult('Do nothing wait for the notification'); break; case \Adyen\Payment\Model\Notification::CANCELLED: $this->_adyenLogger->addAdyenResult('Cancel or Hold the order'); $result = false; break; case \Adyen\Payment\Model\Notification::REFUSED: // if refused there will be a AUTHORIZATION : FALSE notification send only exception is idea $this->_adyenLogger->addAdyenResult('Cancel or Hold the order'); $result = false; break; case \Adyen\Payment\Model\Notification::ERROR: //attempt to hold/cancel $this->_adyenLogger->addAdyenResult('Cancel or Hold the order'); $result = false; break; default: $this->_adyenLogger->addAdyenResult('This event is not supported: ' . $authResult); $result = false; break; } return $result; }
/** * Validate 3D secure payment */ public function execute() { $active = null; // check if 3d is active $order = $this->_getOrder(); if ($order->getPayment()) { $active = $order->getPayment()->getAdditionalInformation('3dActive'); } // check if 3D secure is active. If not just go to success page if ($active) { $this->_adyenLogger->addAdyenResult("3D secure is active"); // check if it is already processed if ($this->getRequest()->isPost()) { $this->_adyenLogger->addAdyenResult("Process 3D secure payment"); $requestMD = $this->getRequest()->getPost('MD'); $requestPaRes = $this->getRequest()->getPost('PaRes'); $md = $order->getPayment()->getAdditionalInformation('md'); if ($requestMD == $md) { $order->getPayment()->setAdditionalInformation('paResponse', $requestPaRes); try { /** * Magento should allow this. * https://github.com/magento/magento2/issues/5819 */ // $result = $order->getPayment()->getMethodInstance()->executeCommand( // 'authorise_3d', // ['payment' => $order->getPayment(), 'amount' => $order->getGrandTotal()] // ); // old fashion way: $result = $this->_authorise3d($order->getPayment()); } catch (\Exception $e) { $this->_adyenLogger->addAdyenResult("Process 3D secure payment was refused"); $result = 'Refused'; } $this->_adyenLogger->addAdyenResult("Process 3D secure payment result is: " . $result); // check if authorise3d was successful if ($result == 'Authorised') { $order->addStatusHistoryComment(__('3D-secure validation was successful'))->save(); $this->_redirect('checkout/onepage/success'); } else { $order->addStatusHistoryComment(__('3D-secure validation was unsuccessful.'))->save(); $this->_adyenHelper->cancelOrder($order); $this->messageManager->addErrorMessage("3D-secure validation was unsuccessful"); // reactivate the quote $session = $this->_getCheckout(); // restore the quote $session->restoreQuote(); $this->_redirect('checkout/cart'); } } } else { $this->_adyenLogger->addAdyenResult("Customer was redirected to bank for 3D-secure validation."); $order->addStatusHistoryComment(__('Customer was redirected to bank for 3D-secure validation.'))->save(); $this->_view->loadLayout(); $this->_view->getLayout()->initMessages(); $this->_view->renderLayout(); } } else { $this->_redirect('checkout/onepage/success/'); } }