Skip to content

Commit 71574fb

Browse files
committed
MC-18199: Improving extensibility usability of CardinalCommerce module
- Introduced JwtParserInterface - Introduced CAVV response code validator for Authorize.net - Added CardinalCommerce description in admin panel
1 parent 079bdf0 commit 71574fb

File tree

12 files changed

+142
-12
lines changed

12 files changed

+142
-12
lines changed

app/code/Magento/AuthorizenetAcceptjs/etc/adminhtml/di.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,9 @@
3131
</argument>
3232
</arguments>
3333
</virtualType>
34+
<virtualType name="AuthorizenetAcceptjsAuthorizeCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">
35+
<arguments>
36+
<argument name="validator" xsi:type="object">AuthorizenetAcceptjsTransactionValidator</argument>
37+
</arguments>
38+
</virtualType>
3439
</config>

app/code/Magento/AuthorizenetAcceptjs/etc/di.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
<arguments>
135135
<argument name="requestBuilder" xsi:type="object">AuthorizenetAcceptjsRefundRequest</argument>
136136
<argument name="handler" xsi:type="object">AuthorizenetAcceptjsRefundSettledHandler</argument>
137+
<argument name="validator" xsi:type="object">AuthorizenetAcceptjsTransactionValidator</argument>
137138
</arguments>
138139
</virtualType>
139140
<virtualType name="AuthorizenetAcceptjsCaptureCommand" type="Magento\AuthorizenetAcceptjs\Gateway\Command\CaptureStrategyCommand">
@@ -145,6 +146,7 @@
145146
<arguments>
146147
<argument name="requestBuilder" xsi:type="object">AuthorizenetAcceptjsCaptureRequest</argument>
147148
<argument name="handler" xsi:type="object">AuthorizenetAcceptjsCaptureTransactionHandler</argument>
149+
<argument name="validator" xsi:type="object">AuthorizenetAcceptjsTransactionValidator</argument>
148150
</arguments>
149151
</virtualType>
150152
<virtualType name="AuthorizenetAcceptjsVoidCommand" type="Magento\Payment\Gateway\Command\GatewayCommand">

app/code/Magento/AuthorizenetCardinal/Gateway/Request/Authorize3DSecureBuilder.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
use Magento\AuthorizenetAcceptjs\Gateway\SubjectReader;
1212
use Magento\AuthorizenetCardinal\Model\Config;
13-
use Magento\CardinalCommerce\Model\Response\JwtParser;
13+
use Magento\CardinalCommerce\Model\Response\JwtParserInterface;
1414
use Magento\Payment\Gateway\Request\BuilderInterface;
1515
use Magento\Sales\Model\Order\Payment;
1616

@@ -30,19 +30,19 @@ class Authorize3DSecureBuilder implements BuilderInterface
3030
private $config;
3131

3232
/**
33-
* @var JwtParser
33+
* @var JwtParserInterface
3434
*/
3535
private $jwtParser;
3636

3737
/**
3838
* @param SubjectReader $subjectReader
3939
* @param Config $config
40-
* @param JwtParser $jwtParser
40+
* @param JwtParserInterface $jwtParser
4141
*/
4242
public function __construct(
4343
SubjectReader $subjectReader,
4444
Config $config,
45-
JwtParser $jwtParser
45+
JwtParserInterface $jwtParser
4646
) {
4747
$this->subjectReader = $subjectReader;
4848
$this->config = $config;
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\AuthorizenetCardinal\Gateway\Validator;
10+
11+
use Magento\AuthorizenetAcceptjs\Gateway\SubjectReader;
12+
use Magento\AuthorizenetCardinal\Model\Config;
13+
use Magento\Payment\Gateway\Validator\AbstractValidator;
14+
use Magento\Payment\Gateway\Validator\ResultInterface;
15+
use Magento\Payment\Gateway\Validator\ResultInterfaceFactory;
16+
17+
/**
18+
* Validates cardholder authentication verification response code.
19+
*/
20+
class CavvResponseValidator extends AbstractValidator
21+
{
22+
/**
23+
* The result code that authorize.net returns if CAVV passed validation.
24+
*/
25+
private const RESULT_CODE_SUCCESS = '2';
26+
27+
/**
28+
* @var SubjectReader
29+
*/
30+
private $subjectReader;
31+
32+
/**
33+
* @var ResultInterfaceFactory
34+
*/
35+
private $resultFactory;
36+
37+
/**
38+
* @var Config
39+
*/
40+
private $config;
41+
42+
/**
43+
* @param ResultInterfaceFactory $resultFactory
44+
* @param SubjectReader $subjectReader
45+
* @param Config $config
46+
*/
47+
public function __construct(
48+
ResultInterfaceFactory $resultFactory,
49+
SubjectReader $subjectReader,
50+
Config $config
51+
) {
52+
parent::__construct($resultFactory);
53+
54+
$this->resultFactory = $resultFactory;
55+
$this->subjectReader = $subjectReader;
56+
$this->config = $config;
57+
}
58+
59+
/**
60+
* @inheritdoc
61+
*/
62+
public function validate(array $validationSubject): ResultInterface
63+
{
64+
if ($this->config->isActive() === false) {
65+
return $this->createResult(true);
66+
}
67+
68+
$response = $this->subjectReader->readResponse($validationSubject);
69+
$transactionResponse = $response['transactionResponse'];
70+
71+
$cavvResultCode = $transactionResponse['cavvResultCode'] ?? '';
72+
$isValid = $cavvResultCode === self::RESULT_CODE_SUCCESS;
73+
$errorCodes = [];
74+
$errorMessages = [];
75+
76+
if (!$isValid) {
77+
$errorCodes[] = $transactionResponse['cavvResultCode'];
78+
$errorMessages[] = 'CAVV failed validation';
79+
}
80+
81+
return $this->createResult($isValid, $errorMessages, $errorCodes);
82+
}
83+
}

app/code/Magento/AuthorizenetCardinal/etc/di.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,20 @@
1313
</argument>
1414
</arguments>
1515
</virtualType>
16+
<virtualType name="Magento\AuthorizenetCardinal\Gateway\Validator\VirtualTransactionValidator" type="Magento\Payment\Gateway\Validator\ValidatorComposite">
17+
<arguments>
18+
<argument name="chainBreakingValidators" xsi:type="array">
19+
<item name="general" xsi:type="boolean">true</item>
20+
</argument>
21+
<argument name="validators" xsi:type="array">
22+
<item name="general" xsi:type="string">AuthorizenetAcceptjsTransactionValidator</item>
23+
<item name="cavv_response" xsi:type="string">Magento\AuthorizenetCardinal\Gateway\Validator\CavvResponseValidator</item>
24+
</argument>
25+
</arguments>
26+
</virtualType>
27+
<virtualType name="AuthorizenetAcceptjsAuthorizeCommand">
28+
<arguments>
29+
<argument name="validator" xsi:type="object">Magento\AuthorizenetCardinal\Gateway\Validator\VirtualTransactionValidator</argument>
30+
</arguments>
31+
</virtualType>
1632
</config>

app/code/Magento/AuthorizenetCardinal/view/frontend/web/js/authorizenet-accept-mixin.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ define([
5656
},
5757

5858
/**
59+
* Adds cardinal response JWT to payment additional data.
60+
*
5961
* @returns {Object}
6062
*/
6163
getData: function () {

app/code/Magento/CardinalCommerce/Model/Response/JwtParser.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
use Magento\Payment\Model\Method\Logger as PaymentLogger;
1515

1616
/**
17-
* Parse content of CardinalCommerce response JWT.
17+
* Parses content of CardinalCommerce response JWT.
1818
*/
19-
class JwtParser
19+
class JwtParser implements JwtParserInterface
2020
{
2121
/**
2222
* @var JwtManagement
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\CardinalCommerce\Model\Response;
8+
9+
/**
10+
* Parses content of CardinalCommerce response JWT.
11+
*/
12+
interface JwtParserInterface
13+
{
14+
/**
15+
* Returns response JWT content.
16+
*
17+
* @param string $jwt
18+
* @return array
19+
*/
20+
public function execute(string $jwt): array;
21+
}

app/code/Magento/CardinalCommerce/etc/adminhtml/system.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
<resource>Magento_Sales::three_d_secure</resource>
1414
<group id="cardinal" type="text" sortOrder="13" showInDefault="1" showInWebsite="1" showInStore="0">
1515
<group id="config" translate="label comment" sortOrder="15" showInDefault="1" showInWebsite="1" showInStore="0">
16-
<label>Configuration</label>
17-
<comment><![CDATA[For support contact <a href="mailto:support@cardinalcommerce.com">support@cardinalcommerce.com</a>.]]>
18-
</comment>
16+
<label>CardinalCommerce</label>
17+
<comment><![CDATA[Please visit <a href="https://www.cardinalcommerce.com/" target="_blank">www.cardinalcommerce.com</a> to get the CardinalCommerce credentials and find out more details about PSD2 SCA requirements. For support contact <a href="mailto:support@cardinalcommerce.com">support@cardinalcommerce.com</a>.]]></comment>
1918
<field id="environment" translate="label" type="select" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="0">
2019
<label>Environment</label>
2120
<source_model>Magento\CardinalCommerce\Model\Adminhtml\Source\Environment</source_model>

app/code/Magento/CardinalCommerce/etc/di.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<preference for="Magento\CardinalCommerce\Model\Response\JwtPayloadValidatorInterface" type="Magento\CardinalCommerce\Model\Response\JwtPayloadValidator" />
10+
<preference for="Magento\CardinalCommerce\Model\Response\JwtParserInterface" type="Magento\CardinalCommerce\Model\Response\JwtParser" />
1011
</config>

0 commit comments

Comments
 (0)