Skip to content

Commit aa7458c

Browse files
committed
MAGETWO-84907: Duplicate array key #12519
- Merge Pull Request #12519 from lfluvisotto/magento2:2.1-develop-duplicate-array-key - Merged commits: 1. 1588566
2 parents 409eef5 + 1588566 commit aa7458c

File tree

173 files changed

+5142
-2068
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

173 files changed

+5142
-2068
lines changed

app/code/Magento/Braintree/Block/Form.php

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
*/
2222
class Form extends Cc
2323
{
24-
2524
/**
2625
* @var Quote
2726
*/
@@ -81,7 +80,7 @@ public function getCcAvailableTypes()
8180
*/
8281
public function useCvv()
8382
{
84-
return $this->gatewayConfig->isCvvEnabled();
83+
return $this->gatewayConfig->isCvvEnabled($this->sessionQuote->getStoreId());
8584
}
8685

8786
/**
@@ -90,9 +89,8 @@ public function useCvv()
9089
*/
9190
public function isVaultEnabled()
9291
{
93-
$storeId = $this->_storeManager->getStore()->getId();
9492
$vaultPayment = $this->getVaultPayment();
95-
return $vaultPayment->isActive($storeId);
93+
return $vaultPayment->isActive($this->sessionQuote->getStoreId());
9694
}
9795

9896
/**
@@ -102,7 +100,10 @@ public function isVaultEnabled()
102100
private function getConfiguredCardTypes()
103101
{
104102
$types = $this->ccType->getCcTypeLabelMap();
105-
$configCardTypes = array_fill_keys($this->gatewayConfig->getAvailableCardTypes(), '');
103+
$configCardTypes = array_fill_keys(
104+
$this->gatewayConfig->getAvailableCardTypes($this->sessionQuote->getStoreId()),
105+
''
106+
);
106107

107108
return array_intersect_key($types, $configCardTypes);
108109
}
@@ -116,7 +117,11 @@ private function getConfiguredCardTypes()
116117
private function filterCardTypesForCountry(array $configCardTypes, $countryId)
117118
{
118119
$filtered = $configCardTypes;
119-
$countryCardTypes = $this->gatewayConfig->getCountryAvailableCardTypes($countryId);
120+
$countryCardTypes = $this->gatewayConfig->getCountryAvailableCardTypes(
121+
$countryId,
122+
$this->sessionQuote->getStoreId()
123+
);
124+
120125
// filter card types only if specific card types are set for country
121126
if (!empty($countryCardTypes)) {
122127
$availableTypes = array_fill_keys($countryCardTypes, '');

app/code/Magento/Braintree/Block/Payment.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public function getPaymentConfig()
4444
$payment = $this->config->getConfig()['payment'];
4545
$config = $payment[$this->getCode()];
4646
$config['code'] = $this->getCode();
47+
$config['clientTokenUrl'] = $this->_urlBuilder->getUrl(
48+
'braintree/payment/getClientToken',
49+
['_secure' => true]
50+
);
4751
return json_encode($config, JSON_UNESCAPED_SLASHES);
4852
}
4953

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\Braintree\Controller\Adminhtml\Payment;
7+
8+
use Magento\Backend\App\Action;
9+
use Magento\Backend\App\Action\Context;
10+
use Magento\Backend\Model\Session\Quote;
11+
use Magento\Braintree\Gateway\Config\Config;
12+
use Magento\Braintree\Gateway\Request\PaymentDataBuilder;
13+
use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
14+
use Magento\Framework\Controller\ResultFactory;
15+
16+
class GetClientToken extends Action
17+
{
18+
const ADMIN_RESOURCE = 'Magento_Braintree::get_client_token';
19+
20+
/**
21+
* @var Config
22+
*/
23+
private $config;
24+
25+
/**
26+
* @var BraintreeAdapterFactory
27+
*/
28+
private $adapterFactory;
29+
30+
/**
31+
* @var Quote
32+
*/
33+
private $quoteSession;
34+
35+
/**
36+
* @param Context $context
37+
* @param Config $config
38+
* @param BraintreeAdapterFactory $adapterFactory
39+
* @param Quote $quoteSession
40+
*/
41+
public function __construct(
42+
Context $context,
43+
Config $config,
44+
BraintreeAdapterFactory $adapterFactory,
45+
Quote $quoteSession
46+
) {
47+
parent::__construct($context);
48+
$this->config = $config;
49+
$this->adapterFactory = $adapterFactory;
50+
$this->quoteSession = $quoteSession;
51+
}
52+
53+
/**
54+
* @inheritdoc
55+
*/
56+
public function execute()
57+
{
58+
$params = [];
59+
$response = $this->resultFactory->create(ResultFactory::TYPE_JSON);
60+
61+
$storeId = $this->quoteSession->getStoreId();
62+
$merchantAccountId = $this->config->getMerchantAccountId($storeId);
63+
if (!empty($merchantAccountId)) {
64+
$params[PaymentDataBuilder::MERCHANT_ACCOUNT_ID] = $merchantAccountId;
65+
}
66+
67+
$clientToken = $this->adapterFactory->create($storeId)
68+
->generate($params);
69+
$response->setData(['clientToken' => $clientToken]);
70+
71+
return $response;
72+
}
73+
}

app/code/Magento/Braintree/Controller/Payment/GetNonce.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,10 @@ public function execute()
6363
try {
6464
$publicHash = $this->getRequest()->getParam('public_hash');
6565
$customerId = $this->session->getCustomerId();
66-
$result = $this->command->execute(['public_hash' => $publicHash, 'customer_id' => $customerId])->get();
66+
$result = $this->command->execute(
67+
['public_hash' => $publicHash, 'customer_id' => $customerId, 'store_id' => $this->session->getStoreId()]
68+
)
69+
->get();
6770
$response->setData(['paymentMethodNonce' => $result['paymentMethodNonce']]);
6871

6972
} catch (\Exception $e) {

app/code/Magento/Braintree/Gateway/Command/CaptureStrategyCommand.php

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,21 @@
66
namespace Magento\Braintree\Gateway\Command;
77

88
use Braintree\Transaction;
9+
use Magento\Braintree\Gateway\Helper\SubjectReader;
910
use Magento\Braintree\Model\Adapter\BraintreeAdapter;
11+
use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
1012
use Magento\Braintree\Model\Adapter\BraintreeSearchAdapter;
1113
use Magento\Framework\Api\FilterBuilder;
1214
use Magento\Framework\Api\SearchCriteriaBuilder;
13-
use Magento\Payment\Gateway\Command;
15+
use Magento\Framework\App\ObjectManager;
1416
use Magento\Payment\Gateway\Command\CommandPoolInterface;
1517
use Magento\Payment\Gateway\CommandInterface;
18+
use Magento\Payment\Gateway\Data\OrderAdapterInterface;
1619
use Magento\Payment\Gateway\Helper\ContextHelper;
17-
use Magento\Braintree\Gateway\Helper\SubjectReader;
1820
use Magento\Sales\Api\Data\OrderPaymentInterface;
19-
use Magento\Sales\Api\TransactionRepositoryInterface;
2021
use Magento\Sales\Api\Data\TransactionInterface;
22+
use Magento\Sales\Api\TransactionRepositoryInterface;
23+
use Magento\Payment\Gateway\Data\PaymentDataObjectInterface;
2124

2225
/**
2326
* Class CaptureStrategyCommand
@@ -66,25 +69,25 @@ class CaptureStrategyCommand implements CommandInterface
6669
private $subjectReader;
6770

6871
/**
69-
* @var BraintreeAdapter
72+
* @var BraintreeAdapterFactory
7073
*/
71-
private $braintreeAdapter;
74+
private $braintreeAdapterFactory;
7275

7376
/**
7477
* @var BraintreeSearchAdapter
7578
*/
7679
private $braintreeSearchAdapter;
7780

7881
/**
79-
* Constructor
80-
*
8182
* @param CommandPoolInterface $commandPool
8283
* @param TransactionRepositoryInterface $repository
8384
* @param FilterBuilder $filterBuilder
8485
* @param SearchCriteriaBuilder $searchCriteriaBuilder
8586
* @param SubjectReader $subjectReader
8687
* @param BraintreeAdapter $braintreeAdapter
8788
* @param BraintreeSearchAdapter $braintreeSearchAdapter
89+
* @param BraintreeAdapterFactory|null $braintreeAdapterFactory
90+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
8891
*/
8992
public function __construct(
9093
CommandPoolInterface $commandPool,
@@ -93,15 +96,17 @@ public function __construct(
9396
SearchCriteriaBuilder $searchCriteriaBuilder,
9497
SubjectReader $subjectReader,
9598
BraintreeAdapter $braintreeAdapter,
96-
BraintreeSearchAdapter $braintreeSearchAdapter
99+
BraintreeSearchAdapter $braintreeSearchAdapter,
100+
BraintreeAdapterFactory $braintreeAdapterFactory = null
97101
) {
98102
$this->commandPool = $commandPool;
99103
$this->transactionRepository = $repository;
100104
$this->filterBuilder = $filterBuilder;
101105
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
102106
$this->subjectReader = $subjectReader;
103-
$this->braintreeAdapter = $braintreeAdapter;
104107
$this->braintreeSearchAdapter = $braintreeSearchAdapter;
108+
$this->braintreeAdapterFactory = $braintreeAdapterFactory ?
109+
: ObjectManager::getInstance()->get(BraintreeAdapterFactory::class);
105110
}
106111

107112
/**
@@ -112,29 +117,29 @@ public function execute(array $commandSubject)
112117
/** @var \Magento\Payment\Gateway\Data\PaymentDataObjectInterface $paymentDO */
113118
$paymentDO = $this->subjectReader->readPayment($commandSubject);
114119

115-
/** @var \Magento\Sales\Api\Data\OrderPaymentInterface $paymentInfo */
116-
$paymentInfo = $paymentDO->getPayment();
117-
ContextHelper::assertOrderPayment($paymentInfo);
118-
119-
$command = $this->getCommand($paymentInfo);
120+
$command = $this->getCommand($paymentDO);
120121
$this->commandPool->get($command)->execute($commandSubject);
121122
}
122123

123124
/**
124-
* Get execution command name
125-
* @param OrderPaymentInterface $payment
125+
* Gets command name.
126+
*
127+
* @param PaymentDataObjectInterface $paymentDO
126128
* @return string
127129
*/
128-
private function getCommand(OrderPaymentInterface $payment)
130+
private function getCommand(PaymentDataObjectInterface $paymentDO)
129131
{
130-
// if auth transaction is not exists execute authorize&capture command
132+
$payment = $paymentDO->getPayment();
133+
ContextHelper::assertOrderPayment($payment);
134+
135+
// if auth transaction does not exist then execute authorize&capture command
131136
$existsCapture = $this->isExistsCaptureTransaction($payment);
132137
if (!$payment->getAuthorizationTransaction() && !$existsCapture) {
133138
return self::SALE;
134139
}
135140

136141
// do capture for authorization transaction
137-
if (!$existsCapture && !$this->isExpiredAuthorization($payment)) {
142+
if (!$existsCapture && !$this->isExpiredAuthorization($payment, $paymentDO->getOrder())) {
138143
return self::CAPTURE;
139144
}
140145

@@ -143,12 +148,16 @@ private function getCommand(OrderPaymentInterface $payment)
143148
}
144149

145150
/**
151+
* Checks if authorization transaction does not expired yet.
152+
*
146153
* @param OrderPaymentInterface $payment
147-
* @return boolean
154+
* @param OrderAdapterInterface $orderAdapter
155+
* @return bool
148156
*/
149-
private function isExpiredAuthorization(OrderPaymentInterface $payment)
157+
private function isExpiredAuthorization(OrderPaymentInterface $payment, OrderAdapterInterface $orderAdapter)
150158
{
151-
$collection = $this->braintreeAdapter->search(
159+
$adapter = $this->braintreeAdapterFactory->create($orderAdapter->getStoreId());
160+
$collection = $adapter->search(
152161
[
153162
$this->braintreeSearchAdapter->id()->is($payment->getLastTransId()),
154163
$this->braintreeSearchAdapter->status()->is(Transaction::AUTHORIZATION_EXPIRED)

app/code/Magento/Braintree/Gateway/Command/GetPaymentNonceCommand.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
use Magento\Braintree\Gateway\Helper\SubjectReader;
1111
use Magento\Braintree\Gateway\Validator\PaymentNonceResponseValidator;
1212
use Magento\Braintree\Model\Adapter\BraintreeAdapter;
13-
use Magento\Payment\Gateway\Command;
13+
use Magento\Braintree\Model\Adapter\BraintreeAdapterFactory;
14+
use Magento\Framework\App\ObjectManager;
1415
use Magento\Payment\Gateway\Command\Result\ArrayResultFactory;
1516
use Magento\Payment\Gateway\CommandInterface;
1617
use Magento\Vault\Api\PaymentTokenManagementInterface;
@@ -27,9 +28,9 @@ class GetPaymentNonceCommand implements CommandInterface
2728
private $tokenManagement;
2829

2930
/**
30-
* @var BraintreeAdapter
31+
* @var BraintreeAdapterFactory
3132
*/
32-
private $adapter;
33+
private $adapterFactory;
3334

3435
/**
3536
* @var ArrayResultFactory
@@ -52,19 +53,22 @@ class GetPaymentNonceCommand implements CommandInterface
5253
* @param ArrayResultFactory $resultFactory
5354
* @param SubjectReader $subjectReader
5455
* @param PaymentNonceResponseValidator $responseValidator
56+
* @param BraintreeAdapterFactory|null $adapterFactory
57+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
5558
*/
5659
public function __construct(
5760
PaymentTokenManagementInterface $tokenManagement,
5861
BraintreeAdapter $adapter,
5962
ArrayResultFactory $resultFactory,
6063
SubjectReader $subjectReader,
61-
PaymentNonceResponseValidator $responseValidator
64+
PaymentNonceResponseValidator $responseValidator,
65+
BraintreeAdapterFactory $adapterFactory = null
6266
) {
6367
$this->tokenManagement = $tokenManagement;
64-
$this->adapter = $adapter;
6568
$this->resultFactory = $resultFactory;
6669
$this->subjectReader = $subjectReader;
6770
$this->responseValidator = $responseValidator;
71+
$this->adapterFactory = $adapterFactory ?: ObjectManager::getInstance()->get(BraintreeAdapterFactory::class);
6872
}
6973

7074
/**
@@ -80,7 +84,9 @@ public function execute(array $commandSubject)
8084
throw new Exception('No available payment tokens');
8185
}
8286

83-
$data = $this->adapter->createNonce($paymentToken->getGatewayToken());
87+
$storeId = $this->subjectReader->readStoreId($commandSubject);
88+
$data = $this->adapterFactory->create($storeId)
89+
->createNonce($paymentToken->getGatewayToken());
8490
$result = $this->responseValidator->validate(['response' => ['object' => $data]]);
8591

8692
if (!$result->isValid()) {

0 commit comments

Comments
 (0)