| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- <?php
- /**
- * This file is part of the Klarna KP module
- *
- * (c) Klarna Bank AB (publ)
- *
- * For the full copyright and license information, please view the NOTICE
- * and LICENSE files that were distributed with this source code.
- */
- namespace Klarna\Kp\Gateway\Command;
- use Klarna\Core\Api\BuilderInterface;
- use Klarna\Core\Api\OrderRepositoryInterface;
- use Klarna\Core\Model\Api\Builder;
- use Klarna\Core\Model\OrderFactory;
- use Klarna\Kp\Api\CreditApiInterface;
- use Klarna\Kp\Api\Data\RequestInterface;
- use Klarna\Kp\Api\QuoteRepositoryInterface;
- use Klarna\Kp\Model\Payment\Kp;
- use Magento\Payment\Gateway\Command;
- use Magento\Payment\Gateway\Command\CommandException;
- use Magento\Payment\Gateway\CommandInterface;
- use Magento\Quote\Api\CartRepositoryInterface;
- use Magento\Quote\Api\Data\CartInterface;
- /**
- * Class Authorize
- *
- * @package Klarna\Kp\Gateway\Command
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Authorize implements CommandInterface
- {
- /**
- * Fraud status types
- */
- const FRAUD_STATUS_ACCEPTED = 'ACCEPTED';
- const FRAUD_STATUS_REJECTED = 'REJECTED';
- const FRAUD_STATUS_PENDING = 'PENDING';
- /**
- * @var BuilderInterface
- */
- private $builder;
- /**
- * @var OrderFactory
- */
- private $klarnaOrderFactory;
- /**
- * @var OrderRepositoryInterface
- */
- private $klarnaOrderRepository;
- /**
- * @var CartRepositoryInterface
- */
- private $mageQuoteRepository;
- /**
- * @var QuoteRepositoryInterface
- */
- private $klarnaQuoteRepository;
- /**
- * @var CreditApiInterface
- */
- private $api;
- /**
- * @var CartRepositoryInterface
- */
- private $quoteRepository;
- /**
- * @var \Magento\Sales\Api\OrderRepositoryInterface
- */
- private $mageOrderRepository;
- /**
- * Authorize constructor.
- *
- * @param QuoteRepositoryInterface $klarnaQuoteRepository
- * @param CartRepositoryInterface $quoteRepository
- * @param CreditApiInterface $api
- * @param OrderRepositoryInterface $klarnaOrderRepository
- * @param OrderFactory $klarnaOrderFactory
- * @param BuilderInterface $builder
- * @param \Magento\Sales\Api\OrderRepositoryInterface $mageOrderRepository
- * @internal param OrderRepositoryInterface $orderRepository
- * @internal param OrderFactory $orderFactory
- */
- public function __construct(
- QuoteRepositoryInterface $klarnaQuoteRepository,
- CartRepositoryInterface $quoteRepository,
- CreditApiInterface $api,
- OrderRepositoryInterface $klarnaOrderRepository,
- OrderFactory $klarnaOrderFactory,
- BuilderInterface $builder,
- \Magento\Sales\Api\OrderRepositoryInterface $mageOrderRepository
- ) {
- $this->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;
- }
- }
|