77namespace Magento \Paypal \Model ;
88
99use Exception ;
10+ use Magento \Framework \App \ObjectManager ;
1011use Magento \Framework \Exception \LocalizedException ;
1112use Magento \Sales \Model \Order ;
1213use Magento \Sales \Model \Order \Email \Sender \CreditmemoSender ;
1314use Magento \Sales \Model \Order \Email \Sender \OrderSender ;
15+ use Magento \Sales \Model \OrderMutexInterface ;
1416
1517/**
1618 * PayPal Instant Payment Notification processor model
@@ -46,13 +48,19 @@ class Ipn extends \Magento\Paypal\Model\AbstractIpn implements IpnInterface
4648 protected $ creditmemoSender ;
4749
4850 /**
49- * @param \Magento\Paypal\Model\ConfigFactory $configFactory
51+ * @var OrderMutexInterface|null
52+ */
53+ private ?OrderMutexInterface $ orderMutex ;
54+
55+ /**
56+ * @param ConfigFactory $configFactory
5057 * @param \Psr\Log\LoggerInterface $logger
5158 * @param \Magento\Framework\HTTP\Adapter\CurlFactory $curlFactory
5259 * @param \Magento\Sales\Model\OrderFactory $orderFactory
5360 * @param Info $paypalInfo
5461 * @param OrderSender $orderSender
5562 * @param CreditmemoSender $creditmemoSender
63+ * @param OrderMutexInterface|null $orderMutex
5664 * @param array $data
5765 */
5866 public function __construct (
@@ -63,13 +71,15 @@ public function __construct(
6371 Info $ paypalInfo ,
6472 OrderSender $ orderSender ,
6573 CreditmemoSender $ creditmemoSender ,
74+ ?OrderMutexInterface $ orderMutex = null ,
6675 array $ data = []
6776 ) {
6877 parent ::__construct ($ configFactory , $ logger , $ curlFactory , $ data );
6978 $ this ->_orderFactory = $ orderFactory ;
7079 $ this ->_paypalInfo = $ paypalInfo ;
7180 $ this ->orderSender = $ orderSender ;
7281 $ this ->creditmemoSender = $ creditmemoSender ;
82+ $ this ->orderMutex = $ orderMutex ?: ObjectManager::getInstance ()->get (OrderMutexInterface::class);
7383 }
7484
7585 /**
@@ -466,6 +476,21 @@ protected function _registerPaymentReversal()
466476 * @return void
467477 */
468478 protected function _registerPaymentRefund ()
479+ {
480+ return $ this ->orderMutex ->execute (
481+ (int ) $ this ->_order ->getEntityId (),
482+ \Closure::fromCallable ([$ this , 'processRefund ' ])
483+ );
484+ }
485+
486+ /**
487+ * Process a refund
488+ *
489+ * @return void
490+ * @throws Exception
491+ * @SuppressWarnings(PHPMD.UnusedPrivateMethod) This method is used in closure callback
492+ */
493+ private function processRefund ()
469494 {
470495 $ this ->_importPaymentInformation ();
471496 $ reason = $ this ->getRequestData ('reason_code ' );
0 commit comments