getPayment(); /** @var \Magento\Sales\Model\Order $order */ $order = $payment->getOrder(); $klarnaOrder = $this->getKlarnaOrder($order); if (!$klarnaOrder->getId() || !$klarnaOrder->getReservationId()) { throw new KlarnaException(__('Unable to cancel payment for this order.')); } $response = $this->processPayment($order, $klarnaOrder, $payment); if (!$response->getIsSuccessful()) { $errorMessage = __('Order cancellation failed, please try again.'); $errorMessage = $this->getFullErrorMessage($response, $errorMessage, 'cancel'); throw new KlarnaException($errorMessage); } if ($response->getTransactionId()) { $payment->setTransactionId($response->getTransactionId()); } return null; } /** * Process cancel/refund for order * * @param MageOrderInterface $order * @param KlarnaOrderInterface $klarnaOrder * @return \Magento\Framework\DataObject */ private function processPayment($order, $klarnaOrder) { if ($order->hasInvoices()) { return $this->getOmApi($order)->release($klarnaOrder->getReservationId()); } return $this->getOmApi($order)->cancel($klarnaOrder->getReservationId()); } }