Commit 89409fb6 authored by Alexandros Moraitis's avatar Alexandros Moraitis Committed by GitHub

[PW-3127] Validate payment methods (#838)

* payment methods response validation

* Remove getConnectedTerminals

* Refactor

* Fix suggestions

* Refactor paymentmethods

* Refactor method names

* Refactor payment method request
parent 17cb8cb9
<?php
/**
* ######
* ######
* ############ ####( ###### #####. ###### ############ ############
* ############# #####( ###### #####. ###### ############# #############
* ###### #####( ###### #####. ###### ##### ###### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ##### ######
* ###### ###### #####( ###### #####. ###### ##### ##### ######
* ############# ############# ############# ############# ##### ######
* ############ ############ ############# ############ ##### ######
* ######
* #############
* ############
*
* Adyen Payment module (https://www.adyen.com/)
*
* Copyright (c) 2020 Adyen BV (https://www.adyen.com/)
* See LICENSE.txt for license details.
*
* Author: Adyen <magento@adyen.com>
*/
namespace Adyen\Payment\Helper;
class ConnectedTerminals
{
/**
* @var \Magento\Checkout\Model\Session
*/
protected $session;
/**
* @var \Adyen\Payment\Helper\Data
*/
protected $adyenHelper;
public function __construct(
\Adyen\Payment\Helper\Data $adyenHelper,
\Magento\Checkout\Model\Session $session
) {
$this->adyenHelper = $adyenHelper;
$this->session = $session;
}
/**
* @return array|mixed
* @throws \Adyen\AdyenException
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/
public function getConnectedTerminals()
{
$storeId = $this->session->getQuote()->getStoreId();
// initialize the adyen client
$client = $this->adyenHelper->initializeAdyenClient($storeId, $this->adyenHelper->getPosApiKey($storeId));
// initialize service
$service = $this->adyenHelper->createAdyenPosPaymentService($client);
$requestParams = [
"merchantAccount" => $this->adyenHelper->getAdyenMerchantAccount('adyen_pos_cloud', $storeId),
];
// In case the POS store id is set, provide in the request
if (!empty($this->adyenHelper->getPosStoreId($storeId))) {
$requestParams['store'] = $this->adyenHelper->getPosStoreId($storeId);
}
try {
$responseData = $service->getConnectedTerminals($requestParams);
} catch (\Adyen\AdyenException $e) {
$this->adyenLogger->error(
"The getConnectedTerminals response is empty check your Adyen configuration in Magento."
);
// return empty result
return [];
}
return $responseData;
}
}
...@@ -45,11 +45,6 @@ class PaymentMethods extends AbstractHelper ...@@ -45,11 +45,6 @@ class PaymentMethods extends AbstractHelper
*/ */
protected $adyenHelper; protected $adyenHelper;
/**
* @var \Magento\Checkout\Model\Session
*/
protected $session;
/** /**
* @var \Magento\Framework\Locale\ResolverInterface * @var \Magento\Framework\Locale\ResolverInterface
*/ */
...@@ -96,7 +91,6 @@ class PaymentMethods extends AbstractHelper ...@@ -96,7 +91,6 @@ class PaymentMethods extends AbstractHelper
* @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository * @param \Magento\Quote\Api\CartRepositoryInterface $quoteRepository
* @param \Magento\Framework\App\Config\ScopeConfigInterface $config * @param \Magento\Framework\App\Config\ScopeConfigInterface $config
* @param Data $adyenHelper * @param Data $adyenHelper
* @param \Magento\Checkout\Model\Session $session
* @param \Magento\Framework\Locale\ResolverInterface $localeResolver * @param \Magento\Framework\Locale\ResolverInterface $localeResolver
* @param \Adyen\Payment\Logger\AdyenLogger $adyenLogger * @param \Adyen\Payment\Logger\AdyenLogger $adyenLogger
* @param \Magento\Framework\View\Asset\Repository $assetRepo * @param \Magento\Framework\View\Asset\Repository $assetRepo
...@@ -109,7 +103,6 @@ class PaymentMethods extends AbstractHelper ...@@ -109,7 +103,6 @@ class PaymentMethods extends AbstractHelper
\Magento\Quote\Api\CartRepositoryInterface $quoteRepository, \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
\Magento\Framework\App\Config\ScopeConfigInterface $config, \Magento\Framework\App\Config\ScopeConfigInterface $config,
\Adyen\Payment\Helper\Data $adyenHelper, \Adyen\Payment\Helper\Data $adyenHelper,
\Magento\Checkout\Model\Session $session,
\Magento\Framework\Locale\ResolverInterface $localeResolver, \Magento\Framework\Locale\ResolverInterface $localeResolver,
\Adyen\Payment\Logger\AdyenLogger $adyenLogger, \Adyen\Payment\Logger\AdyenLogger $adyenLogger,
\Magento\Framework\View\Asset\Repository $assetRepo, \Magento\Framework\View\Asset\Repository $assetRepo,
...@@ -121,7 +114,6 @@ class PaymentMethods extends AbstractHelper ...@@ -121,7 +114,6 @@ class PaymentMethods extends AbstractHelper
$this->quoteRepository = $quoteRepository; $this->quoteRepository = $quoteRepository;
$this->config = $config; $this->config = $config;
$this->adyenHelper = $adyenHelper; $this->adyenHelper = $adyenHelper;
$this->session = $session;
$this->localeResolver = $localeResolver; $this->localeResolver = $localeResolver;
$this->adyenLogger = $adyenLogger; $this->adyenLogger = $adyenLogger;
$this->assetRepo = $assetRepo; $this->assetRepo = $assetRepo;
...@@ -132,7 +124,12 @@ class PaymentMethods extends AbstractHelper ...@@ -132,7 +124,12 @@ class PaymentMethods extends AbstractHelper
} }
/** /**
* {@inheritDoc} * @param $quoteId
* @param null $country
* @return array
* @throws \Adyen\AdyenException
* @throws \Magento\Framework\Exception\LocalizedException
* @throws \Magento\Framework\Exception\NoSuchEntityException
*/ */
public function getPaymentMethods($quoteId, $country = null) public function getPaymentMethods($quoteId, $country = null)
{ {
...@@ -146,15 +143,16 @@ class PaymentMethods extends AbstractHelper ...@@ -146,15 +143,16 @@ class PaymentMethods extends AbstractHelper
$this->setQuote($quote); $this->setQuote($quote);
$paymentMethods = $this->fetchAlternativeMethods($country); return $this->fetchPaymentMethods($country);
return $paymentMethods;
} }
/** /**
* @param $country * @param $country
* @return array * @return array
* @throws \Adyen\AdyenException
* @throws \Magento\Framework\Exception\LocalizedException
*/ */
protected function fetchAlternativeMethods($country) protected function fetchPaymentMethods($country)
{ {
$quote = $this->getQuote(); $quote = $this->getQuote();
$store = $quote->getStore(); $store = $quote->getStore();
...@@ -165,95 +163,28 @@ class PaymentMethods extends AbstractHelper ...@@ -165,95 +163,28 @@ class PaymentMethods extends AbstractHelper
return []; return [];
} }
$currencyCode = $this->getCurrentCurrencyCode($store); $paymentMethodRequest = $this->getPaymentMethodsRequest($merchantAccount, $store, $country, $quote);
$responseData = $this->getPaymentMethodsResponse($paymentMethodRequest, $store);
$adyFields = [
"channel" => "Web",
"merchantAccount" => $merchantAccount,
"countryCode" => $this->getCurrentCountryCode($store, $country),
"amount" => [
"currency" => $currencyCode,
"value" => $this->adyenHelper->formatAmount(
$this->getCurrentPaymentAmount(),
$currencyCode
),
],
"shopperReference" => $this->getCurrentShopperReference(),
"shopperLocale" => $this->adyenHelper->getCurrentLocaleCode($store->getId())
];
$billingAddress = $quote->getBillingAddress();
if (!empty($billingAddress)) { if (empty($responseData['paymentMethods'])) {
if ($customerTelephone = trim($billingAddress->getTelephone())) { return [];
$adyFields['telephoneNumber'] = $customerTelephone;
}
}
$responseData = $this->getPaymentMethodsResponse($adyFields, $store);
$paymentMethods = [];
if (isset($responseData['paymentMethods'])) {
foreach ($responseData['paymentMethods'] as $paymentMethod) {
$paymentMethodCode = $paymentMethod['type'];
$paymentMethod = $this->fieldMapPaymentMethod($paymentMethod);
// check if payment method is an openinvoice method
$paymentMethod['isPaymentMethodOpenInvoiceMethod'] =
$this->adyenHelper->isPaymentMethodOpenInvoiceMethod($paymentMethodCode);
// add icon location in result
if ($this->adyenHelper->showLogos()) {
// Fix for MAGETWO-70402 https://github.com/magento/magento2/pull/7686
// Explicitly setting theme
$themeCode = "Magento/blank";
$themeId = $this->design->getConfigurationDesignTheme(\Magento\Framework\App\Area::AREA_FRONTEND);
if (!empty($themeId)) {
$theme = $this->themeProvider->getThemeById($themeId);
if ($theme && !empty($theme->getCode())) {
$themeCode = $theme->getCode();
}
} }
$params = []; $paymentMethods = $responseData['paymentMethods'];
$params = array_merge( $response['paymentMethodsResponse'] = $responseData;
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'_secure' => $this->request->isSecure(),
'theme' => $themeCode
],
$params
);
$asset = $this->assetRepo->createAsset(
'Adyen_Payment::images/logos/' .
$paymentMethodCode . '.png',
$params
);
$placeholder = $this->assetSource->findSource($asset); // Add extra details per payment method
$paymentMethodsExtraDetails = [];
$paymentMethodsExtraDetails = $this->showLogosPaymentMethods($paymentMethods, $paymentMethodsExtraDetails);
$response['paymentMethodsExtraDetails'] = $paymentMethodsExtraDetails;
$icon = null; //TODO this should be the implemented with an interface
if ($placeholder) { return json_encode($response);
list($width, $height) = getimagesize($asset->getSourceFile());
$icon = [
'url' => $asset->getUrl(),
'width' => $width,
'height' => $height
];
}
$paymentMethod['icon'] = $icon;
}
$paymentMethods[$paymentMethodCode] = $paymentMethod;
}
}
return $paymentMethods;
} }
/** /**
* @return float * @return float
* @throws \Exception
*/ */
protected function getCurrentPaymentAmount() protected function getCurrentPaymentAmount()
{ {
...@@ -326,28 +257,6 @@ class PaymentMethods extends AbstractHelper ...@@ -326,28 +257,6 @@ class PaymentMethods extends AbstractHelper
return ""; return "";
} }
/**
* @var array
*/
protected $fieldMapPaymentMethod = [
'name' => 'title'
];
/**
* @param $paymentMethod
* @return mixed
*/
protected function fieldMapPaymentMethod($paymentMethod)
{
foreach ($this->fieldMapPaymentMethod as $field => $newField) {
if (isset($paymentMethod[$field])) {
$paymentMethod[$newField] = $paymentMethod[$field];
unset($paymentMethod[$field]);
}
}
return $paymentMethod;
}
/** /**
* @param $requestParams * @param $requestParams
* @param $store * @param $store
...@@ -400,38 +309,115 @@ class PaymentMethods extends AbstractHelper ...@@ -400,38 +309,115 @@ class PaymentMethods extends AbstractHelper
} }
/** /**
* @return array|mixed * @param $merchantAccount
* @throws \Adyen\AdyenException * @param \Magento\Store\Model\Store $store
* @param $country
* @param \Magento\Quote\Model\Quote $quote
* @return array
* @throws \Exception
*/ */
public function getConnectedTerminals() protected function getPaymentMethodsRequest(
{ $merchantAccount,
$storeId = $this->session->getQuote()->getStoreId(); \Magento\Store\Model\Store $store,
$country,
\Magento\Quote\Model\Quote $quote
) {
$currencyCode = $this->getCurrentCurrencyCode($store);
// initialize the adyen client $paymentMethodRequest = [
$client = $this->adyenHelper->initializeAdyenClient($storeId, $this->adyenHelper->getPosApiKey($storeId)); "channel" => "Web",
"merchantAccount" => $merchantAccount,
"countryCode" => $this->getCurrentCountryCode($store, $country),
"shopperLocale" => $this->adyenHelper->getCurrentLocaleCode($store->getId()),
"amount" => [
"currency" => $currencyCode
]
];
// initialize service if (!empty($this->getCurrentShopperReference())) {
$service = $this->adyenHelper->createAdyenPosPaymentService($client); $paymentMethodRequest["shopperReference"] = $this->getCurrentShopperReference();
}
$requestParams = [ $amountValue = $this->adyenHelper->formatAmount($this->getCurrentPaymentAmount(), $currencyCode);
"merchantAccount" => $this->adyenHelper->getAdyenMerchantAccount('adyen_pos_cloud', $storeId),
];
// In case the POS store id is set, provide in the request if (!empty($amountValue)) {
if (!empty($this->adyenHelper->getPosStoreId($storeId))) { $paymentMethodRequest["amount"]["value"] = $amountValue;
$requestParams['store'] = $this->adyenHelper->getPosStoreId($storeId);
} }
try { $billingAddress = $quote->getBillingAddress();
$responseData = $service->getConnectedTerminals($requestParams);
} catch (\Adyen\AdyenException $e) { if (!empty($billingAddress)) {
$this->adyenLogger->error( if ($customerTelephone = trim($billingAddress->getTelephone())) {
"The getConnectedTerminals response is empty check your Adyen configuration in Magento." $paymentMethodRequest['telephoneNumber'] = $customerTelephone;
}
}
return $paymentMethodRequest;
}
/**
* @param $paymentMethods
* @param array $paymentMethodsExtraDetails
* @return array
* @throws \Magento\Framework\Exception\LocalizedException
*/
protected function showLogosPaymentMethods($paymentMethods, array $paymentMethodsExtraDetails)
{
if ($this->adyenHelper->showLogos()) {
// Explicitly setting theme
$themeCode = "Magento/blank";
$themeId = $this->design->getConfigurationDesignTheme(\Magento\Framework\App\Area::AREA_FRONTEND);
if (!empty($themeId)) {
$theme = $this->themeProvider->getThemeById($themeId);
if ($theme && !empty($theme->getCode())) {
$themeCode = $theme->getCode();
}
}
$params = [];
$params = array_merge(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND,
'_secure' => $this->request->isSecure(),
'theme' => $themeCode
],
$params
); );
// return empty result
return []; foreach ($paymentMethods as $paymentMethod) {
$paymentMethodCode = $paymentMethod['type'];
$asset = $this->assetRepo->createAsset(
'Adyen_Payment::images/logos/' .
$paymentMethodCode . '.png',
$params
);
$placeholder = $this->assetSource->findSource($asset);
if ($placeholder) {
list($width, $height) = getimagesize($asset->getSourceFile());
$icon = [
'url' => $asset->getUrl(),
'width' => $width,
'height' => $height
];
} else {
$icon = [
'url' => 'https://checkoutshopper-live.adyen.com/checkoutshopper/images/logos/medium/' . $paymentMethodCode . '.png',
'width' => 77,
'height' => 50
];
} }
return $responseData; $paymentMethodsExtraDetails[$paymentMethodCode]['icon'] = $icon;
//todo check if it is needed
// check if payment method is an open invoice method
$paymentMethodsExtraDetails[$paymentMethodCode]['isOpenInvoice'] =
$this->adyenHelper->isPaymentMethodOpenInvoiceMethod($paymentMethodCode);
}
}
return $paymentMethodsExtraDetails;
} }
} }
...@@ -43,9 +43,9 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface ...@@ -43,9 +43,9 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface
protected $urlBuilder; protected $urlBuilder;
/** /**
* @var \Adyen\Payment\Helper\PaymentMethods * @var \Adyen\Payment\Helper\ConnectedTerminals
*/ */
protected $paymentMethodsHelper; protected $connectedTerminalsHelper;
/** /**
* @var \Adyen\Payment\Helper\Data * @var \Adyen\Payment\Helper\Data
...@@ -62,20 +62,20 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface ...@@ -62,20 +62,20 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface
* *
* @param \Magento\Framework\App\RequestInterface $request * @param \Magento\Framework\App\RequestInterface $request
* @param \Magento\Framework\UrlInterface $urlBuilder * @param \Magento\Framework\UrlInterface $urlBuilder
* @param \Adyen\Payment\Helper\PaymentMethods $paymentMethodsHelper * @param \Adyen\Payment\Helper\ConnectedTerminals $connectedTerminalsHelper
* @param \Adyen\Payment\Helper\Data $adyenHelper * @param \Adyen\Payment\Helper\Data $adyenHelper
* @param \Magento\Framework\Serialize\SerializerInterface $serializer * @param \Magento\Framework\Serialize\SerializerInterface $serializer
*/ */
public function __construct( public function __construct(
\Magento\Framework\App\RequestInterface $request, \Magento\Framework\App\RequestInterface $request,
\Magento\Framework\UrlInterface $urlBuilder, \Magento\Framework\UrlInterface $urlBuilder,
\Adyen\Payment\Helper\PaymentMethods $paymentMethodsHelper, \Adyen\Payment\Helper\ConnectedTerminals $connectedTerminalsHelper,
\Adyen\Payment\Helper\Data $adyenHelper, \Adyen\Payment\Helper\Data $adyenHelper,
\Magento\Framework\Serialize\SerializerInterface $serializer \Magento\Framework\Serialize\SerializerInterface $serializer
) { ) {
$this->request = $request; $this->request = $request;
$this->urlBuilder = $urlBuilder; $this->urlBuilder = $urlBuilder;
$this->paymentMethodsHelper = $paymentMethodsHelper; $this->connectedTerminalsHelper = $connectedTerminalsHelper;
$this->adyenHelper = $adyenHelper; $this->adyenHelper = $adyenHelper;
$this->serializer = $serializer; $this->serializer = $serializer;
} }
...@@ -137,7 +137,7 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface ...@@ -137,7 +137,7 @@ class AdyenPosCloudConfigProvider implements ConfigProviderInterface
*/ */
protected function getConnectedTerminals() protected function getConnectedTerminals()
{ {
$connectedTerminals = $this->paymentMethodsHelper->getConnectedTerminals(); $connectedTerminals = $this->connectedTerminalsHelper->getConnectedTerminals();
if (!empty($connectedTerminals['uniqueTerminalIds'])) { if (!empty($connectedTerminals['uniqueTerminalIds'])) {
return $connectedTerminals['uniqueTerminalIds']; return $connectedTerminals['uniqueTerminalIds'];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment