Skip to content

Commit 084157b

Browse files
committed
MAGETWO-57115: [Github] Braintree Vault payments causing GET order API to throw error #6215
- Replaced token_metadata array by separate fields - Added upgrade data script
1 parent 29d72c0 commit 084157b

File tree

6 files changed

+63
-24
lines changed

6 files changed

+63
-24
lines changed

app/code/Magento/Vault/Model/Method/Vault.php

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
*/
3232
final class Vault implements VaultPaymentInterface
3333
{
34+
/**
35+
* @deprecated
36+
*/
3437
const TOKEN_METADATA_KEY = 'token_metadata';
3538

3639
/**
@@ -111,6 +114,8 @@ final class Vault implements VaultPaymentInterface
111114
* @param PaymentTokenManagementInterface $tokenManagement
112115
* @param OrderPaymentExtensionInterfaceFactory $paymentExtensionFactory
113116
* @param string $code
117+
*
118+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
114119
*/
115120
public function __construct(
116121
ConfigInterface $config,
@@ -452,17 +457,14 @@ public function capture(\Magento\Payment\Model\InfoInterface $payment, $amount)
452457
private function attachTokenExtensionAttribute(OrderPaymentInterface $orderPayment)
453458
{
454459
$additionalInformation = $orderPayment->getAdditionalInformation();
455-
456-
$tokenData = isset($additionalInformation[self::TOKEN_METADATA_KEY])
457-
? $additionalInformation[self::TOKEN_METADATA_KEY]
458-
: null;
459-
460-
if ($tokenData === null) {
461-
throw new \LogicException("Token metadata should be defined");
460+
if (empty($additionalInformation[PaymentTokenInterface::CUSTOMER_ID]) ||
461+
empty($additionalInformation[PaymentTokenInterface::PUBLIC_HASH])
462+
) {
463+
throw new \LogicException('Customer id and public hash should be defined');
462464
}
463465

464-
$customerId = $tokenData[PaymentTokenInterface::CUSTOMER_ID];
465-
$publicHash = $tokenData[PaymentTokenInterface::PUBLIC_HASH];
466+
$customerId = $additionalInformation[PaymentTokenInterface::CUSTOMER_ID];
467+
$publicHash = $additionalInformation[PaymentTokenInterface::PUBLIC_HASH];
466468

467469
$paymentToken = $this->tokenManagement->getByPublicHash($publicHash, $customerId);
468470

app/code/Magento/Vault/Observer/PaymentTokenAssigner.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public function execute(Observer $observer)
6565
}
6666

6767
$paymentModel->setAdditionalInformation(
68-
Vault::TOKEN_METADATA_KEY,
6968
[
7069
PaymentTokenInterface::CUSTOMER_ID => $customerId,
7170
PaymentTokenInterface::PUBLIC_HASH => $tokenPublicHash

app/code/Magento/Vault/Setup/UpgradeData.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,41 @@ class UpgradeData implements UpgradeDataInterface
2222
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
2323
{
2424
$setup->startSetup();
25+
$connection = $setup->getConnection();
2526

27+
// data update for Vault module < 2.0.1
2628
if (version_compare($context->getVersion(), '2.0.1', '<')) {
27-
$connection = $setup->getConnection();
29+
// update sets credit card as default token type
2830
$connection->update($setup->getTable(InstallSchema::PAYMENT_TOKEN_TABLE), [
2931
PaymentTokenInterface::TYPE => CreditCardTokenFactory::TOKEN_TYPE_CREDIT_CARD
3032
], PaymentTokenInterface::TYPE . ' = ""');
3133
}
34+
35+
// data update for Vault module < 2.0.2
36+
if (version_compare($context->getVersion(), '2.0.2', '<')) {
37+
// update converts additional info with token metadata to single dimensional array
38+
$select = $connection->select()
39+
->from($setup->getTable('sales_order_payment'), 'entity_id')
40+
->columns(['additional_information'])
41+
->where('additional_information LIKE ?', '%token_metadata%');
42+
43+
$items = $connection->fetchAll($select);
44+
foreach ($items as $item) {
45+
$additionalInfo = unserialize($item['additional_information']);
46+
$additionalInfo[PaymentTokenInterface::CUSTOMER_ID] =
47+
$additionalInfo['token_metadata'][PaymentTokenInterface::CUSTOMER_ID];
48+
$additionalInfo[PaymentTokenInterface::PUBLIC_HASH] =
49+
$additionalInfo['token_metadata'][PaymentTokenInterface::PUBLIC_HASH];
50+
unset($additionalInfo['token_metadata']);
51+
52+
$connection->update(
53+
$setup->getTable('sales_order_payment'),
54+
['additional_information' => serialize($additionalInfo)],
55+
['entity_id = ?' => $item['entity_id']]
56+
);
57+
}
58+
}
59+
3260
$setup->endSetup();
3361
}
3462
}

app/code/Magento/Vault/Test/Unit/Model/Method/VaultTest.php

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,39 @@ public function testAuthorizeNotOrderPayment()
5050
}
5151

5252
/**
53+
* @param array $additionalInfo
5354
* @expectedException \LogicException
54-
* @expectedExceptionMessage Token metadata should be defined
55+
* @expectedExceptionMessage Customer id and public hash should be defined
56+
* @dataProvider additionalInfoDataProvider
5557
*/
56-
public function testAuthorizeNoTokenMetadata()
58+
public function testAuthorizeNoTokenMetadata(array $additionalInfo)
5759
{
5860
$paymentModel = $this->getMockBuilder(Payment::class)
5961
->disableOriginalConstructor()
6062
->getMock();
6163

6264
$paymentModel->expects(static::once())
6365
->method('getAdditionalInformation')
64-
->willReturn([]);
66+
->willReturn($additionalInfo);
6567

6668
/** @var Vault $model */
6769
$model = $this->objectManager->getObject(Vault::class);
6870
$model->authorize($paymentModel, 0);
6971
}
7072

73+
/**
74+
* Get list of additional information variations
75+
* @return array
76+
*/
77+
public function additionalInfoDataProvider()
78+
{
79+
return [
80+
['additionalInfo' => []],
81+
['additionalInfo' => ['customer_id' => 1]],
82+
['additionalInfo' => ['public_hash' => 'df768aak12uf']],
83+
];
84+
}
85+
7186
/**
7287
* @expectedException \LogicException
7388
* @expectedExceptionMessage No token found
@@ -86,10 +101,8 @@ public function testAuthorizeNoToken()
86101
->method('getAdditionalInformation')
87102
->willReturn(
88103
[
89-
Vault::TOKEN_METADATA_KEY => [
90-
PaymentTokenInterface::CUSTOMER_ID => $customerId,
91-
PaymentTokenInterface::PUBLIC_HASH => $publicHash
92-
]
104+
PaymentTokenInterface::CUSTOMER_ID => $customerId,
105+
PaymentTokenInterface::PUBLIC_HASH => $publicHash
93106
]
94107
);
95108
$tokenManagement->expects(static::once())
@@ -133,10 +146,8 @@ public function testAuthorize()
133146
->method('getAdditionalInformation')
134147
->willReturn(
135148
[
136-
Vault::TOKEN_METADATA_KEY => [
137-
PaymentTokenInterface::CUSTOMER_ID => $customerId,
138-
PaymentTokenInterface::PUBLIC_HASH => $publicHash
139-
]
149+
PaymentTokenInterface::CUSTOMER_ID => $customerId,
150+
PaymentTokenInterface::PUBLIC_HASH => $publicHash
140151
]
141152
);
142153
$tokenManagement->expects(static::once())

app/code/Magento/Vault/Test/Unit/Observer/PaymentTokenAssignerTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ public function testExecuteSaveMetadata()
161161
$paymentModel->expects(static::once())
162162
->method('setAdditionalInformation')
163163
->with(
164-
Vault::TOKEN_METADATA_KEY,
165164
[
166165
PaymentTokenInterface::CUSTOMER_ID => $customerId,
167166
PaymentTokenInterface::PUBLIC_HASH => $publicHash

app/code/Magento/Vault/etc/module.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
9-
<module name="Magento_Vault" setup_version="2.0.1">
9+
<module name="Magento_Vault" setup_version="2.0.2">
1010
<sequence>
1111
<module name="Magento_Sales"/>
1212
<module name="Magento_Store"/>

0 commit comments

Comments
 (0)