128 private $paymentFailures;
164 \
Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
169 \
Magento\Framework\Module\ModuleListInterface $moduleList,
170 \
Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate,
184 \
Magento\Sales\Api\PaymentFailuresInterface $paymentFailures =
null 192 $this->_code = static::METHOD_CODE;
194 ->get(\
Magento\Sales\Api\PaymentFailuresInterface::class);
200 $customAttributeFactory,
262 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid amount for capture.'));
267 if (
$payment->getParentTransactionId()) {
268 $payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE);
271 $payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE);
275 if (empty(
$result->getData())) {
293 switch (
$result->getXResponseCode()) {
297 $result->getXResponseReasonCode(),
305 if (!
$payment->getParentTransactionId()
311 ->setTransactionAdditionalInfo(
312 self::REAL_TRANSACTION_ID_KEY,
317 throw new \Magento\Framework\Exception\LocalizedException(
318 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
322 throw new \Magento\Framework\Exception\LocalizedException(
323 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
326 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Payment capturing error.'));
339 if (!
$payment->getParentTransactionId()) {
340 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid transaction ID.'));
343 $payment->setAnetTransType(self::REQUEST_TYPE_VOID);
349 switch (
$result->getXResponseCode()) {
356 ->setShouldCloseParentTransaction(1)
357 ->setTransactionAdditionalInfo(self::REAL_TRANSACTION_ID_KEY,
$result->getXTransId());
360 throw new \Magento\Framework\Exception\LocalizedException(
361 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
365 throw new \Magento\Framework\Exception\LocalizedException(
366 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
369 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Payment voiding error.'));
388 }
catch (\Exception $e) {
407 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid amount for refund.'));
410 if (!
$payment->getParentTransactionId()) {
411 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Invalid transaction ID.'));
414 $payment->setAnetTransType(self::REQUEST_TYPE_CREDIT);
421 switch (
$result->getXResponseCode()) {
427 $payment->setIsTransactionClosed(
true)
428 ->setTransactionAdditionalInfo(self::REAL_TRANSACTION_ID_KEY,
$result->getXTransId());
431 throw new \Magento\Framework\Exception\LocalizedException(
432 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
436 throw new \Magento\Framework\Exception\LocalizedException(
437 $this->dataHelper->wrapGatewayError(
$result->getXResponseReasonText())
440 throw new \Magento\Framework\Exception\LocalizedException(
__(
'Payment refunding error.'));
466 return $this->dataHelper->getRelayUrl(
$storeId);
490 switch ($paymentAction) {
498 $order->setCanSendNewEmailFlag(
false);
499 $payment->setBaseAmountAuthorized($order->getBaseTotalDue());
500 $payment->setAmountAuthorized($order->getTotalDue());
501 $payment->setAnetTransType($requestType);
516 $request = $this->requestFactory->create()
517 ->setConstantData($this)
518 ->setDataFromOrder(
$order, $this)
521 $this->_debug([
'request' =>
$request->getData()]);
552 throw new \Magento\Framework\Exception\LocalizedException(
553 __(
'The transaction was declined because the response hash validation failed.')
568 $this->_debug([
'response' => $responseData]);
577 $responseText = $this->dataHelper->wrapGatewayError(
$response->getXResponseReasonText());
579 if ($this->getOrderIncrementId()) {
580 $order = $this->getOrderFromResponse();
584 throw new \Magento\Framework\Exception\LocalizedException(
585 __(
'This payment didn\'t work out because we can\'t find this order.')
588 if ($order->getId()) {
599 $responseText = $responseText && !
$response->isApproved()
601 :
__(
'This payment didn\'t work out because we can\'t find this order.');
602 throw new \Magento\Framework\Exception\LocalizedException($responseText);
615 $payment->setTransactionId(
$response->getXTransId())
616 ->setParentTransactionId(
null)
617 ->setIsTransactionClosed(0)
618 ->setTransactionAdditionalInfo(self::REAL_TRANSACTION_ID_KEY,
$response->getXTransId());
626 $payment->setIsTransactionPending(
true)
627 ->setIsFraudDetected(
true);
639 switch ($this->
getResponse()->getXResponseCode()) {
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);
650 throw new \Magento\Framework\Exception\LocalizedException(
651 __(
'There was a payment authorization error.')
665 throw new \Magento\Framework\Exception\LocalizedException(
666 __(
'Please enter a transaction ID to authorize this payment.')
680 return sprintf(
'%.2F',
$amount) == sprintf(
'%.2F', $this->
getResponse()->getXAmount());
698 }
catch (\Exception $e) {
710 $payment->getMethodInstance()->setIsInitializeNeeded(
false);
721 'Something went wrong: the paid amount doesn\'t match the order amount.' 722 .
' Please correct this and try again.' 725 throw new \Magento\Framework\Exception\LocalizedException(
$message);
729 if (!
$response->hasOrderSendConfirmation() ||
$response->getOrderSendConfirmation()) {
730 $this->orderSender->send(
$order);
733 $quote = $this->quoteRepository->get(
$order->getQuoteId())->setIsActive(
false);
734 $this->quoteRepository->save(
$quote);
735 }
catch (\Exception $e) {
749 $fraudDetailsResponse =
$payment->getMethodInstance()
750 ->fetchTransactionFraudDetails($this->
getResponse()->getXTransId());
751 $fraudData = $fraudDetailsResponse->getData();
753 if (empty($fraudData)) {
754 $payment->setIsFraudDetected(
false);
758 $fdsFilterAction = (string)$fraudDetailsResponse->getFdsFilterAction();
759 if ($this->fdsFilterActionIsReportOnly($fdsFilterAction) ===
false) {
763 $payment->setAdditionalInformation(
'fraud_details', $fraudData);
764 }
catch (\Exception $e) {
780 $transactionId = $this->
getResponse()->getXTransId();
781 $data = $this->transactionService->getTransactionDetails($this, $transactionId);
782 $transactionStatus = (string)
$data->transaction->transactionStatus;
783 $fdsFilterAction = (
string)
$data->transaction->FDSFilterAction;
785 if (
$payment->getIsTransactionPending()) {
786 $message =
'Amount of %1 is pending approval on the gateway.<br/>' 787 .
'Transaction "%2" status is "%3".<br/>' 788 .
'Transaction FDS Filter Action is "%4"';
793 $this->dataHelper->getTransactionStatusLabel($transactionStatus),
794 $this->dataHelper->getFdsFilterActionLabel($fdsFilterAction)
798 }
catch (\Exception $e) {
799 $this->getPsrLogger()->critical($e);
819 && strtoupper(
$response->getXType()) == self::REQUEST_TYPE_AUTH_ONLY
822 ->setTransactionId(
null)
823 ->setParentTransactionId(
$response->getXTransId())
827 }
catch (\Exception $e) {
829 $this->getPsrLogger()->critical($e);
841 $transaction = $this->transactionRepository->getByTransactionId(
846 return $transaction->getAdditionalInformation(self::REAL_TRANSACTION_ID_KEY);
877 $this->_isInitializeNeeded = (bool)$isInitializeNeeded;
901 $transaction = $this->transactionRepository->getByTransactionId(
909 if (
$response->getTransactionStatus() ==
'voided') {
910 $payment->setIsTransactionDenied(
true);
911 $payment->setIsTransactionClosed(
true);
914 $transaction->setAdditionalInformation(self::TRANSACTION_FRAUD_STATE_KEY,
false);
915 $payment->setIsTransactionApproved(
true);
918 $payment->setIsTransactionDenied(
true);
935 if (
$payment->getIsTransactionApproved()) {
937 'Transaction %1 has been approved. Amount %2. Transaction status is "%3"',
939 $payment->getOrder()->getBaseCurrency()->formatTxt(
$payment->getAmountAuthorized()),
940 $this->dataHelper->getTransactionStatusLabel(
$response->getTransactionStatus())
945 'Transaction %1 has been voided/declined. Transaction status is "%2". Amount %3.',
947 $this->dataHelper->getTransactionStatusLabel(
$response->getTransactionStatus()),
948 $payment->getOrder()->getBaseCurrency()->formatTxt(
$payment->getAmountAuthorized())
988 $responseXmlDocument = $this->transactionService->getTransactionDetails($this, $transactionId);
990 $response = new \Magento\Framework\DataObject();
991 $response->setXResponseCode((
string)$responseXmlDocument->transaction->responseCode)
992 ->setXResponseReasonCode((
string)$responseXmlDocument->transaction->responseReasonCode)
993 ->setTransactionStatus((
string)$responseXmlDocument->transaction->transactionStatus);
1003 private function getPsrLogger()
1005 if (
null === $this->psrLogger) {
1007 ->get(\Psr\Log\LoggerInterface::class);
1009 return $this->psrLogger;
1017 private function getOrderFromResponse(): \
Magento\Sales\Model\Order
1019 if (!$this->
order) {
1020 $this->
order = $this->orderFactory->create();
1022 if ($incrementId = $this->getOrderIncrementId()) {
1023 $this->
order = $this->
order->loadByIncrementId($incrementId);
1027 return $this->order;
1035 private function getOrderIncrementId(): string
1047 private function fdsFilterActionIsReportOnly($fdsFilterAction)
1049 return $fdsFilterAction === (string)$this->dataHelper->getFdsFilterActionLabel(
'report');
declineOrder(\Magento\Sales\Model\Order $order, $message='', $voidPayment=true)
initialize($paymentAction, $stateObject)
$_canRefundInvoicePartial
const RESPONSE_REASON_CODE_APPROVED
elseif(isset( $params[ 'redirect_parent']))
process(array $responseData)
$_canFetchTransactionInfo
void(\Magento\Payment\Model\InfoInterface $payment)
processRefund(\Magento\Framework\DataObject $payment, $amount)
const RESPONSE_REASON_CODE_PENDING_REVIEW_DECLINED
getRealParentTransactionId($payment)
fillPaymentByResponse(\Magento\Framework\DataObject $payment)
addStatusComment(\Magento\Sales\Model\Order\Payment $payment)
getValue($key, $storeId=null)
processOrder(\Magento\Sales\Model\Order $order)
const REQUEST_TYPE_AUTH_ONLY
authorize(\Magento\Payment\Model\InfoInterface $payment, $amount)
const RESPONSE_REASON_CODE_PENDING_REVIEW
processPaymentFraudStatus(\Magento\Sales\Model\Order\Payment $payment)
const RESPONSE_CODE_ERROR
const RESPONSE_REASON_CODE_PENDING_REVIEW_AUTHORIZED
setDataHelper(\Magento\Authorizenet\Helper\Data $dataHelper)
const RESPONSE_CODE_DECLINED
setPathPattern($pathPattern)
fetchTransactionInfo(\Magento\Payment\Model\InfoInterface $payment, $transactionId)
generateRequestFromOrder(\Magento\Sales\Model\Order $order)
setResponseData(array $postData)
const RESPONSE_CODE_APPROVED
__construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory, \Magento\Framework\Api\AttributeValueFactory $customAttributeFactory, \Magento\Payment\Helper\Data $paymentData, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Payment\Model\Method\Logger $logger, \Magento\Framework\Module\ModuleListInterface $moduleList, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Authorizenet\Helper\Data $dataHelper, \Magento\Authorizenet\Model\Directpost\Request\Factory $requestFactory, \Magento\Authorizenet\Model\Directpost\Response\Factory $responseFactory, \Magento\Authorizenet\Model\TransactionService $transactionService, \Magento\Framework\HTTP\ZendClientFactory $httpClientFactory, \Magento\Sales\Model\OrderFactory $orderFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository, \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender, \Magento\Sales\Api\TransactionRepositoryInterface $transactionRepository, \Magento\Framework\Model\ResourceModel\AbstractResource $resource=null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection=null, array $data=[], \Magento\Sales\Api\PaymentFailuresInterface $paymentFailures=null)
addStatusCommentOnUpdate(\Magento\Sales\Model\Order\Payment $payment, \Magento\Framework\DataObject $response, $transactionId)
const ACTION_AUTHORIZE_CAPTURE
getConfigData($field, $storeId=null)
getTransactionResponse($transactionId)
setMethodCode($methodCode)
order(\Magento\Payment\Model\InfoInterface $payment, $amount)
const REQUEST_TYPE_AUTH_CAPTURE
isGatewayActionsLocked($payment)
getRelayUrl($storeId=null)
processCapture($result, $payment)
refund(\Magento\Payment\Model\InfoInterface $payment, $amount)
capture(\Magento\Payment\Model\InfoInterface $payment, $amount)
setIsInitializeNeeded($isInitializeNeeded=true)