55 */
66namespace Magento \Authorizenet \Model ;
77
8- use Magento \Framework \HTTP \ ZendClientFactory ;
8+ use Magento \Framework \App \ ObjectManager ;
99use Magento \Payment \Model \Method \ConfigInterface ;
1010use Magento \Payment \Model \Method \TransparentInterface ;
11- use Magento \Sales \Model \Order \Email \Sender \OrderSender ;
1211
1312/**
1413 * Authorize.net DirectPost payment method model.
@@ -102,7 +101,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
102101 protected $ response ;
103102
104103 /**
105- * @var OrderSender
104+ * @var \Magento\Sales\Model\Order\Email\Sender\ OrderSender
106105 */
107106 protected $ orderSender ;
108107
@@ -123,6 +122,16 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
123122 */
124123 private $ psrLogger ;
125124
125+ /**
126+ * @var \Magento\Sales\Api\PaymentFailuresInterface
127+ */
128+ private $ paymentFailures ;
129+
130+ /**
131+ * @var \Magento\Sales\Model\Order
132+ */
133+ private $ order ;
134+
126135 /**
127136 * @param \Magento\Framework\Model\Context $context
128137 * @param \Magento\Framework\Registry $registry
@@ -141,11 +150,12 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
141150 * @param \Magento\Sales\Model\OrderFactory $orderFactory
142151 * @param \Magento\Store\Model\StoreManagerInterface $storeManager
143152 * @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
144- * @param OrderSender $orderSender
153+ * @param \Magento\Sales\Model\Order\Email\Sender\ OrderSender $orderSender
145154 * @param \Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository
146155 * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
147156 * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
148157 * @param array $data
158+ * @param \Magento\Sales\Api\PaymentFailuresInterface|null $paymentFailures
149159 * @SuppressWarnings(PHPMD.ExcessiveParameterList)
150160 */
151161 public function __construct (
@@ -162,15 +172,16 @@ public function __construct(
162172 \Magento \Authorizenet \Model \Directpost \Request \Factory $ requestFactory ,
163173 \Magento \Authorizenet \Model \Directpost \Response \Factory $ responseFactory ,
164174 TransactionService $ transactionService ,
165- ZendClientFactory $ httpClientFactory ,
175+ \ Magento \ Framework \ HTTP \ ZendClientFactory $ httpClientFactory ,
166176 \Magento \Sales \Model \OrderFactory $ orderFactory ,
167177 \Magento \Store \Model \StoreManagerInterface $ storeManager ,
168178 \Magento \Quote \Api \CartRepositoryInterface $ quoteRepository ,
169179 \Magento \Sales \Model \Order \Email \Sender \OrderSender $ orderSender ,
170180 \Magento \Sales \Api \TransactionRepositoryInterface $ transactionRepository ,
171181 \Magento \Framework \Model \ResourceModel \AbstractResource $ resource = null ,
172182 \Magento \Framework \Data \Collection \AbstractDb $ resourceCollection = null ,
173- array $ data = []
183+ array $ data = [],
184+ \Magento \Sales \Api \PaymentFailuresInterface $ paymentFailures = null
174185 ) {
175186 $ this ->orderFactory = $ orderFactory ;
176187 $ this ->storeManager = $ storeManager ;
@@ -179,6 +190,8 @@ public function __construct(
179190 $ this ->orderSender = $ orderSender ;
180191 $ this ->transactionRepository = $ transactionRepository ;
181192 $ this ->_code = static ::METHOD_CODE ;
193+ $ this ->paymentFailures = $ paymentFailures ? : ObjectManager::getInstance ()
194+ ->get (\Magento \Sales \Api \PaymentFailuresInterface::class);
182195
183196 parent ::__construct (
184197 $ context ,
@@ -561,13 +574,10 @@ public function process(array $responseData)
561574 $ this ->validateResponse ();
562575
563576 $ response = $ this ->getResponse ();
564- //operate with order
565- $ orderIncrementId = $ response ->getXInvoiceNum ();
566577 $ responseText = $ this ->dataHelper ->wrapGatewayError ($ response ->getXResponseReasonText ());
567578 $ isError = false ;
568- if ($ orderIncrementId ) {
569- /* @var $order \Magento\Sales\Model\Order */
570- $ order = $ this ->orderFactory ->create ()->loadByIncrementId ($ orderIncrementId );
579+ if ($ this ->getOrderIncrementId ()) {
580+ $ order = $ this ->getOrderFromResponse ();
571581 //check payment method
572582 $ payment = $ order ->getPayment ();
573583 if (!$ payment || $ payment ->getMethod () != $ this ->getCode ()) {
@@ -632,9 +642,10 @@ public function checkResponseCode()
632642 return true ;
633643 case self ::RESPONSE_CODE_DECLINED :
634644 case self ::RESPONSE_CODE_ERROR :
635- throw new \Magento \Framework \Exception \LocalizedException (
636- $ this ->dataHelper ->wrapGatewayError ($ this ->getResponse ()->getXResponseReasonText ())
637- );
645+ $ errorMessage = $ this ->dataHelper ->wrapGatewayError ($ this ->getResponse ()->getXResponseReasonText ());
646+ $ order = $ this ->getOrderFromResponse ();
647+ $ this ->paymentFailures ->handle ((int )$ order ->getQuoteId (), $ errorMessage );
648+ throw new \Magento \Framework \Exception \LocalizedException ($ errorMessage );
638649 default :
639650 throw new \Magento \Framework \Exception \LocalizedException (
640651 __ ('There was a payment authorization error. ' )
@@ -988,12 +999,40 @@ protected function getTransactionResponse($transactionId)
988999 private function getPsrLogger ()
9891000 {
9901001 if (null === $ this ->psrLogger ) {
991- $ this ->psrLogger = \ Magento \ Framework \ App \ ObjectManager::getInstance ()
1002+ $ this ->psrLogger = ObjectManager::getInstance ()
9921003 ->get (\Psr \Log \LoggerInterface::class);
9931004 }
9941005 return $ this ->psrLogger ;
9951006 }
9961007
1008+ /**
1009+ * Fetch order by increment id from response.
1010+ *
1011+ * @return \Magento\Sales\Model\Order
1012+ */
1013+ private function getOrderFromResponse (): \Magento \Sales \Model \Order
1014+ {
1015+ if (!$ this ->order ) {
1016+ $ this ->order = $ this ->orderFactory ->create ();
1017+
1018+ if ($ incrementId = $ this ->getOrderIncrementId ()) {
1019+ $ this ->order = $ this ->order ->loadByIncrementId ($ incrementId );
1020+ }
1021+ }
1022+
1023+ return $ this ->order ;
1024+ }
1025+
1026+ /**
1027+ * Fetch order increment id from response.
1028+ *
1029+ * @return string
1030+ */
1031+ private function getOrderIncrementId (): string
1032+ {
1033+ return $ this ->getResponse ()->getXInvoiceNum ();
1034+ }
1035+
9971036 /**
9981037 * Checks if filter action is Report Only. Transactions that trigger this filter are processed as normal,
9991038 * but are also reported in the Merchant Interface as triggering this filter.
0 commit comments