Skip to content

Commit 7f03953

Browse files
authored
Merge pull request #2118 from magento-mpi/MAGETWO-80324
[mpi] MAGETWO-80324: Payment Failed Email is not generated
2 parents ce3efb6 + 498901e commit 7f03953

File tree

21 files changed

+932
-387
lines changed

21 files changed

+932
-387
lines changed

app/code/Magento/Authorizenet/Model/Directpost.php

Lines changed: 52 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
namespace Magento\Authorizenet\Model;
77

88
use Magento\Authorizenet\Model\TransactionService;
9+
use Magento\Framework\App\ObjectManager;
910
use Magento\Framework\HTTP\ZendClientFactory;
1011
use Magento\Payment\Model\Method\ConfigInterface;
1112
use Magento\Payment\Model\Method\TransparentInterface;
1213
use 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.

app/code/Magento/Authorizenet/Test/Unit/Model/DirectpostTest.php

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\Authorizenet\Test\Unit\Model;
77

8+
use Magento\Sales\Api\PaymentFailuresInterface;
89
use Magento\Framework\Simplexml\Element;
910
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
1011
use Magento\Authorizenet\Model\Directpost;
@@ -74,6 +75,11 @@ class DirectpostTest extends \PHPUnit_Framework_TestCase
7475
*/
7576
protected $requestFactory;
7677

78+
/**
79+
* @var PaymentFailuresInterface|\PHPUnit_Framework_MockObject_MockObject
80+
*/
81+
private $paymentFailures;
82+
7783
protected function setUp()
7884
{
7985
$this->scopeConfigMock = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface')
@@ -104,6 +110,12 @@ protected function setUp()
104110
->setMethods(['getTransactionDetails'])
105111
->getMock();
106112

113+
$this->paymentFailures = $this->getMockBuilder(
114+
PaymentFailuresInterface::class
115+
)
116+
->disableOriginalConstructor()
117+
->getMock();
118+
107119
$this->requestFactory = $this->getRequestFactoryMock();
108120
$httpClientFactoryMock = $this->getHttpClientFactoryMock();
109121

@@ -117,7 +129,8 @@ protected function setUp()
117129
'responseFactory' => $this->responseFactoryMock,
118130
'transactionRepository' => $this->transactionRepositoryMock,
119131
'transactionService' => $this->transactionServiceMock,
120-
'httpClientFactory' => $httpClientFactoryMock
132+
'httpClientFactory' => $httpClientFactoryMock,
133+
'paymentFailures' => $this->paymentFailures
121134
]
122135
);
123136
}
@@ -313,12 +326,15 @@ public function checkResponseCodeSuccessDataProvider()
313326
}
314327

315328
/**
329+
* Checks response failures behaviour.
330+
*
316331
* @param bool $responseCode
332+
* @param int $failuresHandlerCalls
317333
*
318334
* @expectedException \Magento\Framework\Exception\LocalizedException
319335
* @dataProvider checkResponseCodeFailureDataProvider
320336
*/
321-
public function testCheckResponseCodeFailure($responseCode)
337+
public function testCheckResponseCodeFailure($responseCode, $failuresHandlerCalls)
322338
{
323339
$reasonText = 'reason text';
324340

@@ -333,6 +349,23 @@ public function testCheckResponseCodeFailure($responseCode)
333349
->with($reasonText)
334350
->willReturn(__('Gateway error: %1', $reasonText));
335351

352+
$orderMock = $this->getMockBuilder(Order::class)
353+
->disableOriginalConstructor()
354+
->getMock();
355+
356+
$orderMock->expects($this->exactly($failuresHandlerCalls))
357+
->method('getQuoteId')
358+
->willReturn(1);
359+
360+
$this->paymentFailures->expects($this->exactly($failuresHandlerCalls))
361+
->method('handle')
362+
->with(1);
363+
364+
$reflection = new \ReflectionClass($this->directpost);
365+
$order = $reflection->getProperty('order');
366+
$order->setAccessible(true);
367+
$order->setValue($this->directpost, $orderMock);
368+
336369
$this->directpost->checkResponseCode();
337370
}
338371

@@ -342,9 +375,9 @@ public function testCheckResponseCodeFailure($responseCode)
342375
public function checkResponseCodeFailureDataProvider()
343376
{
344377
return [
345-
['responseCode' => Directpost::RESPONSE_CODE_DECLINED],
346-
['responseCode' => Directpost::RESPONSE_CODE_ERROR],
347-
['responseCode' => 999999]
378+
['responseCode' => Directpost::RESPONSE_CODE_DECLINED, 1],
379+
['responseCode' => Directpost::RESPONSE_CODE_ERROR, 1],
380+
['responseCode' => 999999, 0]
348381
];
349382
}
350383

0 commit comments

Comments
 (0)