66namespace Magento \Authorizenet \Model ;
77
88use Magento \Authorizenet \Model \TransactionService ;
9+ use Magento \Framework \App \ObjectManager ;
910use Magento \Framework \HTTP \ZendClientFactory ;
1011use Magento \Payment \Model \Method \ConfigInterface ;
1112use Magento \Payment \Model \Method \TransparentInterface ;
1213use Magento \Sales \Model \Order \Email \Sender \OrderSender ;
14+ use Magento \Sales \Api \PaymentFailuresInterface ;
1315
1416/**
1517 * Authorize.net DirectPost payment method model.
@@ -124,6 +126,16 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
124126 */
125127 private $ psrLogger ;
126128
129+ /**
130+ * @var PaymentFailuresInterface
131+ */
132+ private $ paymentFailures ;
133+
134+ /**
135+ * @var \Magento\Sales\Model\Order
136+ */
137+ private $ order ;
138+
127139 /**
128140 * @param \Magento\Framework\Model\Context $context
129141 * @param \Magento\Framework\Registry $registry
@@ -147,6 +159,7 @@ class Directpost extends \Magento\Authorizenet\Model\Authorizenet implements Tra
147159 * @param \Magento\Framework\Model\ResourceModel\AbstractResource $resource
148160 * @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
149161 * @param array $data
162+ * @param PaymentFailuresInterface|null $paymentFailures
150163 * @SuppressWarnings(PHPMD.ExcessiveParameterList)
151164 */
152165 public function __construct (
@@ -171,7 +184,8 @@ public function __construct(
171184 \Magento \Sales \Api \TransactionRepositoryInterface $ transactionRepository ,
172185 \Magento \Framework \Model \ResourceModel \AbstractResource $ resource = null ,
173186 \Magento \Framework \Data \Collection \AbstractDb $ resourceCollection = null ,
174- array $ data = []
187+ array $ data = [],
188+ PaymentFailuresInterface $ paymentFailures = null
175189 ) {
176190 $ this ->orderFactory = $ orderFactory ;
177191 $ this ->storeManager = $ storeManager ;
@@ -180,6 +194,8 @@ public function __construct(
180194 $ this ->orderSender = $ orderSender ;
181195 $ this ->transactionRepository = $ transactionRepository ;
182196 $ this ->_code = static ::METHOD_CODE ;
197+ $ this ->paymentFailures = $ paymentFailures ? : ObjectManager::getInstance ()
198+ ->get (PaymentFailuresInterface::class);
183199
184200 parent ::__construct (
185201 $ context ,
@@ -564,13 +580,10 @@ public function process(array $responseData)
564580 $ this ->validateResponse ();
565581
566582 $ response = $ this ->getResponse ();
567- //operate with order
568- $ orderIncrementId = $ response ->getXInvoiceNum ();
569583 $ responseText = $ this ->dataHelper ->wrapGatewayError ($ response ->getXResponseReasonText ());
570584 $ isError = false ;
571- if ($ orderIncrementId ) {
572- /* @var $order \Magento\Sales\Model\Order */
573- $ order = $ this ->orderFactory ->create ()->loadByIncrementId ($ orderIncrementId );
585+ if ($ this ->getOrderIncrementId ()) {
586+ $ order = $ this ->getOrderFromResponse ();
574587 //check payment method
575588 $ payment = $ order ->getPayment ();
576589 if (!$ payment || $ payment ->getMethod () != $ this ->getCode ()) {
@@ -635,9 +648,10 @@ public function checkResponseCode()
635648 return true ;
636649 case self ::RESPONSE_CODE_DECLINED :
637650 case self ::RESPONSE_CODE_ERROR :
638- throw new \Magento \Framework \Exception \LocalizedException (
639- $ this ->dataHelper ->wrapGatewayError ($ this ->getResponse ()->getXResponseReasonText ())
640- );
651+ $ errorMessage = $ this ->dataHelper ->wrapGatewayError ($ this ->getResponse ()->getXResponseReasonText ());
652+ $ order = $ this ->getOrderFromResponse ();
653+ $ this ->paymentFailures ->handle ($ order ->getQuoteId (), $ errorMessage );
654+ throw new \Magento \Framework \Exception \LocalizedException ($ errorMessage );
641655 default :
642656 throw new \Magento \Framework \Exception \LocalizedException (
643657 __ ('There was a payment authorization error. ' )
@@ -992,12 +1006,40 @@ protected function getTransactionResponse($transactionId)
9921006 private function getPsrLogger ()
9931007 {
9941008 if (null === $ this ->psrLogger ) {
995- $ this ->psrLogger = \ Magento \ Framework \ App \ ObjectManager::getInstance ()
1009+ $ this ->psrLogger = ObjectManager::getInstance ()
9961010 ->get (\Psr \Log \LoggerInterface::class);
9971011 }
9981012 return $ this ->psrLogger ;
9991013 }
10001014
1015+ /**
1016+ * Fetch order by increment id from response.
1017+ *
1018+ * @return \Magento\Sales\Model\Order
1019+ */
1020+ private function getOrderFromResponse ()
1021+ {
1022+ if (!$ this ->order ) {
1023+ $ this ->order = $ this ->orderFactory ->create ();
1024+
1025+ if ($ incrementId = $ this ->getOrderIncrementId ()) {
1026+ $ this ->order = $ this ->order ->loadByIncrementId ($ incrementId );
1027+ }
1028+ }
1029+
1030+ return $ this ->order ;
1031+ }
1032+
1033+ /**
1034+ * Fetch order increment id from response.
1035+ *
1036+ * @return string
1037+ */
1038+ private function getOrderIncrementId ()
1039+ {
1040+ return $ this ->getResponse ()->getXInvoiceNum ();
1041+ }
1042+
10011043 /**
10021044 * Checks if filter action is Report Only. Transactions that trigger this filter are processed as normal,
10031045 * but are also reported in the Merchant Interface as triggering this filter.
0 commit comments