Express.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Paypal\Model\Adminhtml;
  8. use Magento\Checkout\Model\Session;
  9. use Magento\Framework\Api\AttributeValueFactory;
  10. use Magento\Framework\Api\ExtensionAttributesFactory;
  11. use Magento\Framework\App\Config\ScopeConfigInterface;
  12. use Magento\Framework\Data\Collection\AbstractDb;
  13. use Magento\Framework\Exception\LocalizedExceptionFactory;
  14. use Magento\Framework\Model\Context;
  15. use Magento\Framework\Model\ResourceModel\AbstractResource;
  16. use Magento\Framework\Registry;
  17. use Magento\Framework\UrlInterface;
  18. use Magento\Payment\Helper\Data;
  19. use Magento\Payment\Model\Method\Logger;
  20. use Magento\Paypal\Model\CartFactory;
  21. use Magento\Paypal\Model\Express as PaypalExpress;
  22. use Magento\Paypal\Model\ProFactory;
  23. use Magento\Sales\Api\TransactionRepositoryInterface;
  24. use Magento\Sales\Api\Data\OrderInterface;
  25. use Magento\Sales\Model\Order\Payment;
  26. use Magento\Sales\Model\Order\Payment\Transaction;
  27. use Magento\Sales\Model\Order\Payment\State\AuthorizeCommand;
  28. use Magento\Sales\Model\Order\Payment\Transaction\BuilderInterface;
  29. use Magento\Store\Model\StoreManagerInterface;
  30. use Magento\Framework\Exception\LocalizedException;
  31. use Magento\Paypal\Model\Config;
  32. use Magento\Payment\Model\Method\AbstractMethod;
  33. /**
  34. * Provides ability to make an authorization calls to Paypal API from admin.
  35. *
  36. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  37. */
  38. class Express extends PaypalExpress
  39. {
  40. /**
  41. * @var AuthorizeCommand
  42. */
  43. private $authCommand;
  44. /**
  45. * @param Context $context
  46. * @param Registry $registry
  47. * @param ExtensionAttributesFactory $extensionFactory
  48. * @param AttributeValueFactory $customAttributeFactory
  49. * @param Data $paymentData
  50. * @param ScopeConfigInterface $scopeConfig
  51. * @param Logger $logger
  52. * @param ProFactory $proFactory
  53. * @param StoreManagerInterface $storeManager
  54. * @param UrlInterface $urlBuilder
  55. * @param CartFactory $cartFactory
  56. * @param Session $checkoutSession
  57. * @param LocalizedExceptionFactory $exception
  58. * @param TransactionRepositoryInterface $transactionRepository
  59. * @param BuilderInterface $transactionBuilder
  60. * @param AuthorizeCommand $authCommand
  61. * @param AbstractResource $resource
  62. * @param AbstractDb $resourceCollection
  63. * @param array $data
  64. * @SuppressWarnings(PHPMD.ExcessiveParameterList)
  65. */
  66. public function __construct(
  67. Context $context,
  68. Registry $registry,
  69. ExtensionAttributesFactory $extensionFactory,
  70. AttributeValueFactory $customAttributeFactory,
  71. Data $paymentData,
  72. ScopeConfigInterface $scopeConfig,
  73. Logger $logger,
  74. ProFactory $proFactory,
  75. StoreManagerInterface $storeManager,
  76. UrlInterface $urlBuilder,
  77. CartFactory $cartFactory,
  78. Session $checkoutSession,
  79. LocalizedExceptionFactory $exception,
  80. TransactionRepositoryInterface $transactionRepository,
  81. BuilderInterface $transactionBuilder,
  82. AuthorizeCommand $authCommand,
  83. AbstractResource $resource = null,
  84. AbstractDb $resourceCollection = null,
  85. $data = []
  86. ) {
  87. $this->authCommand = $authCommand;
  88. parent::__construct(
  89. $context,
  90. $registry,
  91. $extensionFactory,
  92. $customAttributeFactory,
  93. $paymentData,
  94. $scopeConfig,
  95. $logger,
  96. $proFactory,
  97. $storeManager,
  98. $urlBuilder,
  99. $cartFactory,
  100. $checkoutSession,
  101. $exception,
  102. $transactionRepository,
  103. $transactionBuilder,
  104. $resource,
  105. $resourceCollection,
  106. $data
  107. );
  108. }
  109. /**
  110. * Creates an authorization of requested amount.
  111. *
  112. * @param OrderInterface $order
  113. * @return $this
  114. * @throws LocalizedException
  115. */
  116. public function authorizeOrder(OrderInterface $order)
  117. {
  118. $baseTotalDue = $order->getBaseTotalDue();
  119. /** @var $payment Payment */
  120. $payment = $order->getPayment();
  121. if (!$payment || !$this->isOrderAuthorizationAllowed($payment)) {
  122. throw new LocalizedException(__('Authorization is not allowed.'));
  123. }
  124. $orderTransaction = $this->getOrderTransaction($payment);
  125. $api = $this->_callDoAuthorize($baseTotalDue, $payment, $orderTransaction->getTxnId());
  126. $this->_pro->importPaymentInfo($api, $payment);
  127. $payment->resetTransactionAdditionalInfo()
  128. ->setIsTransactionClosed(false)
  129. ->setTransactionId($api->getTransactionId())
  130. ->setParentTransactionId($orderTransaction->getTxnId());
  131. $transaction = $payment->addTransaction(Transaction::TYPE_AUTH, null, true);
  132. $message = $this->authCommand->execute($payment, $baseTotalDue, $payment->getOrder());
  133. $message = $payment->prependMessage($message);
  134. $payment->addTransactionCommentsToOrder($transaction, $message);
  135. $payment->setAmountAuthorized($order->getTotalDue());
  136. $payment->setBaseAmountAuthorized($baseTotalDue);
  137. return $this;
  138. }
  139. /**
  140. * Checks if payment has authorization transactions.
  141. *
  142. * @param Payment $payment
  143. * @return bool
  144. */
  145. private function hasAuthorization(Payment $payment): bool
  146. {
  147. return (bool) ($payment->getAmountAuthorized() ?? 0);
  148. }
  149. /**
  150. * Checks if payment authorization allowed.
  151. *
  152. * @param Payment $payment
  153. * @return bool
  154. * @throws LocalizedException
  155. */
  156. public function isOrderAuthorizationAllowed(Payment $payment): bool
  157. {
  158. if ($payment->getMethod() === Config::METHOD_EXPRESS &&
  159. $payment->getMethodInstance()->getConfigPaymentAction() === AbstractMethod::ACTION_ORDER
  160. ) {
  161. return !$this->hasAuthorization($payment);
  162. }
  163. return false;
  164. }
  165. }