From 72b98e07bd6444a3600572b96cd47c276ca144af Mon Sep 17 00:00:00 2001 From: Dmitry Pryshchepa Date: Tue, 14 Dec 2021 19:22:24 +0100 Subject: [PATCH] SPRO-54: Display Google Pay & Apple Pay methods via Adyen Introduce Google and Apple payment methods --- .../TokenUiComponentProviderAdyenHpp.php | 59 ++++++++++++++++++ .../TokenUiComponentProviderApplePay.php | 59 ++++++++++++++++++ .../TokenUiComponentProviderGooglePay.php | 60 +++++++++++++++++++ Observer/AdyenCcDataAssignObserver.php | 12 +--- Observer/Payment/AdyenHppTokenAssigner.php | 27 +++++++++ Observer/Payment/ApplePayTokenAssigner.php | 26 ++++++++ Observer/Payment/GooglePayTokenAssigner.php | 26 ++++++++ Observer/Payment/TokenAssigner.php | 22 +++++-- etc/adminhtml/di.xml | 12 ++++ etc/config.xml | 14 +++++ etc/di.xml | 6 ++ etc/events.xml | 19 ++++++ etc/module.xml | 2 +- .../layout/sales_order_create_index.xml | 23 +++++++ ...order_create_load_block_billing_method.xml | 19 ++++++ 15 files changed, 369 insertions(+), 17 deletions(-) create mode 100644 Model/Ui/Adminhtml/TokenUiComponentProviderAdyenHpp.php create mode 100644 Model/Ui/Adminhtml/TokenUiComponentProviderApplePay.php create mode 100644 Model/Ui/Adminhtml/TokenUiComponentProviderGooglePay.php create mode 100644 Observer/Payment/AdyenHppTokenAssigner.php create mode 100644 Observer/Payment/ApplePayTokenAssigner.php create mode 100644 Observer/Payment/GooglePayTokenAssigner.php create mode 100644 etc/adminhtml/di.xml create mode 100644 view/adminhtml/layout/sales_order_create_index.xml create mode 100644 view/adminhtml/layout/sales_order_create_load_block_billing_method.xml diff --git a/Model/Ui/Adminhtml/TokenUiComponentProviderAdyenHpp.php b/Model/Ui/Adminhtml/TokenUiComponentProviderAdyenHpp.php new file mode 100644 index 0000000..fb4f96c --- /dev/null +++ b/Model/Ui/Adminhtml/TokenUiComponentProviderAdyenHpp.php @@ -0,0 +1,59 @@ +componentFactory = $componentFactory; + $this->adyenHelper = $adyenHelper; + } + + /** + * @inheritdoc + */ + public function getComponentForToken(PaymentTokenInterface $paymentToken) + { + $details = json_decode($paymentToken->getTokenDetails() ?: '{}', true); + $details['icon'] = $this->adyenHelper->getVariantIcon($details['type']); + $component = $this->componentFactory->create( + [ + 'config' => [ + 'code' => 'adyen_hpp_vault', + TokenUiComponentProviderInterface::COMPONENT_DETAILS => $details, + TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH => $paymentToken->getPublicHash(), + 'template' => 'Adyen_Payment::form/vault.phtml' + ], + 'name' => Template::class + ] + ); + return $component; + } +} diff --git a/Model/Ui/Adminhtml/TokenUiComponentProviderApplePay.php b/Model/Ui/Adminhtml/TokenUiComponentProviderApplePay.php new file mode 100644 index 0000000..8400579 --- /dev/null +++ b/Model/Ui/Adminhtml/TokenUiComponentProviderApplePay.php @@ -0,0 +1,59 @@ +componentFactory = $componentFactory; + $this->adyenHelper = $adyenHelper; + } + + /** + * @inheritdoc + */ + public function getComponentForToken(PaymentTokenInterface $paymentToken) + { + $details = json_decode($paymentToken->getTokenDetails() ?: '{}', true); + $details['icon'] = $this->adyenHelper->getVariantIcon($details['type']); + $component = $this->componentFactory->create( + [ + 'config' => [ + 'code' => 'adyen_apple_pay_vault', + TokenUiComponentProviderInterface::COMPONENT_DETAILS => $details, + TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH => $paymentToken->getPublicHash(), + 'template' => 'Adyen_Payment::form/vault.phtml' + ], + 'name' => Template::class + ] + ); + return $component; + } +} diff --git a/Model/Ui/Adminhtml/TokenUiComponentProviderGooglePay.php b/Model/Ui/Adminhtml/TokenUiComponentProviderGooglePay.php new file mode 100644 index 0000000..fe21a76 --- /dev/null +++ b/Model/Ui/Adminhtml/TokenUiComponentProviderGooglePay.php @@ -0,0 +1,60 @@ +componentFactory = $componentFactory; + $this->adyenHelper = $adyenHelper; + } + + /** + * @inheritdoc + */ + public function getComponentForToken(PaymentTokenInterface $paymentToken) + { + $details = json_decode($paymentToken->getTokenDetails() ?: '{}', true); + $details['icon'] = $this->adyenHelper->getVariantIcon($details['type']); + $component = $this->componentFactory->create( + [ + 'config' => [ + 'code' => AdyenGooglePayConfigProvider::GOOGLE_PAY_VAULT_CODE, + TokenUiComponentProviderInterface::COMPONENT_DETAILS => $details, + TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH => $paymentToken->getPublicHash(), + 'template' => 'Adyen_Payment::form/vault.phtml' + ], + 'name' => Template::class + ] + ); + return $component; + } +} diff --git a/Observer/AdyenCcDataAssignObserver.php b/Observer/AdyenCcDataAssignObserver.php index 43eab23..ec599a5 100644 --- a/Observer/AdyenCcDataAssignObserver.php +++ b/Observer/AdyenCcDataAssignObserver.php @@ -18,11 +18,6 @@ class AdyenCcDataAssignObserver extends AbstractDataAssignObserver */ private $generalConfig; - /** - * @var \Magento\Checkout\Model\Session - */ - private $checkoutSession; - /** * @var \Swarming\SubscribePro\Helper\Quote */ @@ -30,16 +25,13 @@ class AdyenCcDataAssignObserver extends AbstractDataAssignObserver /** * @param \Swarming\SubscribePro\Model\Config\General $generalConfig - * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Swarming\SubscribePro\Helper\Quote $quoteHelper */ public function __construct( \Swarming\SubscribePro\Model\Config\General $generalConfig, - \Magento\Checkout\Model\Session $checkoutSession, \Swarming\SubscribePro\Helper\Quote $quoteHelper ) { $this->generalConfig = $generalConfig; - $this->checkoutSession = $checkoutSession; $this->quoteHelper = $quoteHelper; } @@ -49,7 +41,8 @@ public function __construct( */ public function execute(Observer $observer): void { - $quote = $this->checkoutSession->getQuote(); + $paymentInfo = $this->readPaymentModelArgument($observer); + $quote = $paymentInfo->getQuote(); $websiteCode = $quote->getStore()->getWebsite()->getCode(); if (!$this->generalConfig->isEnabled($websiteCode) || !$this->quoteHelper->hasSubscription($quote)) { @@ -57,7 +50,6 @@ public function execute(Observer $observer): void } $data = $this->readDataArgument($observer); - $paymentInfo = $this->readPaymentModelArgument($observer); $additionalData = $data->getData(PaymentInterface::KEY_ADDITIONAL_DATA); if (!is_array($additionalData) || !empty($additionalData[PaymentTokenInterface::PUBLIC_HASH])) { diff --git a/Observer/Payment/AdyenHppTokenAssigner.php b/Observer/Payment/AdyenHppTokenAssigner.php new file mode 100644 index 0000000..c6d1cf8 --- /dev/null +++ b/Observer/Payment/AdyenHppTokenAssigner.php @@ -0,0 +1,27 @@ +paymentTokenManagement->getByGatewayToken( + $paymentMethodToken, + AdyenHppConfigProvider::CODE, + $customerId + ); + } +} diff --git a/Observer/Payment/ApplePayTokenAssigner.php b/Observer/Payment/ApplePayTokenAssigner.php new file mode 100644 index 0000000..3dc727e --- /dev/null +++ b/Observer/Payment/ApplePayTokenAssigner.php @@ -0,0 +1,26 @@ +paymentTokenManagement->getByGatewayToken( + $paymentMethodToken, + 'adyen_apple_pay', + $customerId + ); + } +} diff --git a/Observer/Payment/GooglePayTokenAssigner.php b/Observer/Payment/GooglePayTokenAssigner.php new file mode 100644 index 0000000..72f0876 --- /dev/null +++ b/Observer/Payment/GooglePayTokenAssigner.php @@ -0,0 +1,26 @@ +paymentTokenManagement->getByGatewayToken( + $paymentMethodToken, + 'adyen_google_pay', + $customerId + ); + } +} diff --git a/Observer/Payment/TokenAssigner.php b/Observer/Payment/TokenAssigner.php index 7bcd1fd..8a224e6 100644 --- a/Observer/Payment/TokenAssigner.php +++ b/Observer/Payment/TokenAssigner.php @@ -16,7 +16,7 @@ class TokenAssigner extends \Magento\Payment\Observer\AbstractDataAssignObserver /** * @var \Magento\Vault\Api\PaymentTokenManagementInterface */ - private $paymentTokenManagement; + protected $paymentTokenManagement; /** * @param \Magento\Vault\Api\PaymentTokenManagementInterface $paymentTokenManagement @@ -54,11 +54,7 @@ public function execute(Observer $observer) return; } - $paymentToken = $this->paymentTokenManagement->getByGatewayToken( - $paymentMethodToken, - AdyenCcConfigProvider::CODE, - $customerId - ); + $paymentToken = $this->getPaymentToken($paymentMethodToken, (int)$customerId); if ($paymentToken === null) { return; } @@ -80,4 +76,18 @@ public function execute(Observer $observer) ); } } + + /** + * @param string $paymentMethodToken + * @param int $customerId + * @return \Magento\Vault\Api\Data\PaymentTokenInterface|null + */ + protected function getPaymentToken(string $paymentMethodToken, int $customerId): ?PaymentTokenInterface + { + return $this->paymentTokenManagement->getByGatewayToken( + $paymentMethodToken, + AdyenCcConfigProvider::CODE, + $customerId + ); + } } diff --git a/etc/adminhtml/di.xml b/etc/adminhtml/di.xml new file mode 100644 index 0000000..6466dfe --- /dev/null +++ b/etc/adminhtml/di.xml @@ -0,0 +1,12 @@ + + + + + + Swarming\SubscribeProAdyen\Model\Ui\Adminhtml\TokenUiComponentProviderApplePay + Swarming\SubscribeProAdyen\Model\Ui\Adminhtml\TokenUiComponentProviderGooglePay + Swarming\SubscribeProAdyen\Model\Ui\Adminhtml\TokenUiComponentProviderAdyenHpp + + + + diff --git a/etc/config.xml b/etc/config.xml index b6a48c5..15c689d 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -4,7 +4,21 @@ adyen_cc_vault + adyen_hpp_vault + adyen_apple_pay_vault + adyen_google_pay_vault + + + 1 + + + 1 + + + 1 + + diff --git a/etc/di.xml b/etc/di.xml index ff827c7..7b725fe 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -4,6 +4,9 @@ adyen_cc + adyen_hpp + adyen_apple_pay + adyen_google_pay @@ -11,6 +14,9 @@ Swarming\SubscribeProAdyen\Service\PaymentProfileDataBuilder + Swarming\SubscribeProAdyen\Service\PaymentProfileDataBuilder + Swarming\SubscribeProAdyen\Service\PaymentProfileDataBuilder + Swarming\SubscribeProAdyen\Service\PaymentProfileDataBuilder diff --git a/etc/events.xml b/etc/events.xml index a2d1185..715f71b 100644 --- a/etc/events.xml +++ b/etc/events.xml @@ -3,7 +3,26 @@ + + + + + + + + + + + + + + + + + + + diff --git a/etc/module.xml b/etc/module.xml index 0f45896..dc30dd2 100755 --- a/etc/module.xml +++ b/etc/module.xml @@ -2,7 +2,7 @@ - + diff --git a/view/adminhtml/layout/sales_order_create_index.xml b/view/adminhtml/layout/sales_order_create_index.xml new file mode 100644 index 0000000..7394ffd --- /dev/null +++ b/view/adminhtml/layout/sales_order_create_index.xml @@ -0,0 +1,23 @@ + + + + + + adyen_apple_pay_vault + Magento_Vault::form/vault.phtml + + + + + adyen_google_pay_vault + Magento_Vault::form/vault.phtml + + + + + adyen_hpp_vault + Magento_Vault::form/vault.phtml + + + + diff --git a/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml b/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml new file mode 100644 index 0000000..bca6b6d --- /dev/null +++ b/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml @@ -0,0 +1,19 @@ + + + + + + adyen_apple_pay_vault + Magento_Vault::form/vault.phtml + + + adyen_google_pay_vault + Magento_Vault::form/vault.phtml + + + adyen_hpp_vault + Magento_Vault::form/vault.phtml + + + +