quoteRepository = $quoteRepository; $this->api = $api; $this->klarnaQuoteRepository = $klarnaQuoteRepository; $this->klarnaOrderRepository = $klarnaOrderRepository; $this->klarnaOrderFactory = $klarnaOrderFactory; $this->builder = $builder; $this->mageQuoteRepository = $quoteRepository; $this->mageOrderRepository = $mageOrderRepository; } /** * Executes command basing on business object * * @param array $commandSubject * @return null|Command\ResultInterface * @throws \Magento\Framework\Exception\NoSuchEntityException * @throws \Klarna\Core\Model\Api\Exception * @throws \Klarna\Core\Exception * @throws \Magento\Framework\Exception\CouldNotSaveException * @throws CommandException */ public function execute(array $commandSubject) { /** @var \Magento\Payment\Model\InfoInterface $payment */ $payment = $commandSubject['payment']->getPayment(); /** @var \Magento\Sales\Api\Data\OrderInterface $order */ $order = $payment->getOrder(); $quote = $this->mageQuoteRepository->get($order->getQuoteId()); $klarnaQuote = $this->getKlarnaQuote($quote); /** @var RequestInterface $data */ $data = $this->builder->setObject($quote)->generateRequest(Builder::GENERATE_TYPE_PLACE)->getRequest(); $authorizationToken = $klarnaQuote->getAuthorizationToken(); $result = $this->getKpApi()->placeOrder($authorizationToken, $data, $klarnaQuote->getSessionId()); if (!$result->isSuccessfull()) { $response = $this->getKpApi()->cancelOrder($authorizationToken, $klarnaQuote->getSessionId()); if (!$response->isSuccessfull()) { $message = $response->getMessage() ?: __('Unable to release authorization for the token %1', $authorizationToken); throw new \Klarna\Core\Model\Api\Exception($message); } throw new \Klarna\Core\Exception(__('Unable to authorize payment for this order.')); } switch ($result->getFraudStatus()) { case self::FRAUD_STATUS_REJECTED: $payment->setIsFraudDetected(true); break; case self::FRAUD_STATUS_PENDING: $payment->setIsTransactionPending(true); break; } $klarnaOrder = $this->klarnaOrderFactory->create(); $payment->getMethodInstance()->setCode(Kp::METHOD_CODE); $order->getPayment()->setMethod(Kp::METHOD_CODE); $this->mageOrderRepository->save($order); $klarnaOrder->setData([ 'klarna_order_id' => $result->getOrderId(), 'reservation_id' => $result->getOrderId(), 'session_id' => $klarnaQuote->getSessionId(), 'order_id' => $order->getId() ]); $this->klarnaOrderRepository->save($klarnaOrder); if (!$klarnaOrder->getId() || !$klarnaOrder->getReservationId()) { throw new \Klarna\Core\Exception(__('Unable to authorize payment for this order.')); } $payment->setTransactionId($result->getOrderId())->setIsTransactionClosed(0); return null; } /** * Get Klarna quote for a sales quote * * @param CartInterface $quote * * @return \Klarna\Kp\Api\QuoteInterface * @throws \Magento\Framework\Exception\NoSuchEntityException */ private function getKlarnaQuote(CartInterface $quote) { return $this->klarnaQuoteRepository->getActiveByQuote($quote); } /** * Get Klarna payments api class * * @return CreditApiInterface */ private function getKpApi() { return $this->api; } }