| Current Path : /home/rtorresani/www/vendor/paypal/module-braintree-core/Gateway/Response/ |
| Current File : //home/rtorresani/www/vendor/paypal/module-braintree-core/Gateway/Response/VaultDetailsHandler.php |
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace PayPal\Braintree\Gateway\Response;
use Braintree\Transaction;
use DateInterval;
use DateTime;
use DateTimeZone;
use Exception;
use Magento\Framework\Exception\InputException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Payment\Gateway\Response\HandlerInterface;
use Magento\Vault\Api\Data\PaymentTokenInterface;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class VaultDetailsHandler extends Handler implements HandlerInterface
{
/**
* @inheritdoc
*/
public function handle(array $handlingSubject, array $response)
{
$paymentDO = $this->subjectReader->readPayment($handlingSubject);
$transaction = $this->subjectReader->readTransaction($response);
$payment = $paymentDO->getPayment();
// add vault payment token entity to extension attributes
$paymentToken = $this->getVaultPaymentToken($transaction);
if (null !== $paymentToken) {
$extensionAttributes = $this->getExtensionAttributes($payment);
$extensionAttributes->setVaultPaymentToken($paymentToken);
}
}
/**
* Get vault payment token entity
*
* @param Transaction $transaction
* @return PaymentTokenInterface|null
* @throws InputException
* @throws NoSuchEntityException
*/
protected function getVaultPaymentToken(Transaction $transaction)
{
// Check token existing in gateway response
$token = $transaction->creditCardDetails->token;
if (empty($token) || empty($transaction->creditCardDetails->expirationYear)) {
return null;
}
/** @var PaymentTokenInterface $paymentToken */
$paymentToken = $this->paymentTokenFactory->create();
$paymentToken->setGatewayToken($token);
$paymentToken->setExpiresAt($this->getExpirationDate($transaction));
$paymentToken->setTokenDetails($this->convertDetailsToJSON([
'type' => $this->getCreditCardType($transaction->creditCardDetails->cardType),
'maskedCC' => $transaction->creditCardDetails->last4,
'expirationDate' => $transaction->creditCardDetails->expirationDate
]));
return $paymentToken;
}
/**
* Get expiration date
*
* @param Transaction $transaction
* @return string
* @throws Exception
* @throws Exception
*/
private function getExpirationDate(Transaction $transaction): string
{
$expDate = new DateTime(
$transaction->creditCardDetails->expirationYear
. '-'
. $transaction->creditCardDetails->expirationMonth
. '-'
. '01'
. ' '
. '00:00:00',
new DateTimeZone('UTC')
);
$expDate->add(new DateInterval('P1M'));
return $expDate->format('Y-m-d 00:00:00');
}
/**
* Get type of credit card mapped from Braintree
*
* @param string $type
* @return string
* @throws InputException
* @throws NoSuchEntityException
*/
private function getCreditCardType($type): string
{
$replaced = str_replace(' ', '-', strtolower($type));
$mapper = $this->config->getCcTypesMapper();
return $mapper[$replaced];
}
}