PaymentConfiguration.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\InstantPurchase\Model\QuoteManagement;
  7. use Magento\Framework\Exception\LocalizedException;
  8. use Magento\InstantPurchase\PaymentMethodIntegration\IntegrationsManager;
  9. use Magento\Quote\Model\Quote;
  10. use Magento\Vault\Api\Data\PaymentTokenInterface;
  11. use Magento\Vault\Model\Ui\VaultConfigProvider;
  12. /**
  13. * Configure payment method for quote.
  14. *
  15. * @api May be used for pluginization.
  16. * @since 100.2.0
  17. */
  18. class PaymentConfiguration
  19. {
  20. const MARKER = 'instant-purchase';
  21. /**
  22. * @var IntegrationsManager
  23. */
  24. private $integrationManager;
  25. /**
  26. * PaymentConfiguration constructor.
  27. * @param IntegrationsManager $integrationsManager
  28. */
  29. public function __construct(
  30. IntegrationsManager $integrationsManager
  31. ) {
  32. $this->integrationManager = $integrationsManager;
  33. }
  34. /**
  35. * Sets payment method information in quote based on stored payment token.
  36. *
  37. * @param Quote $quote
  38. * @param PaymentTokenInterface $paymentToken
  39. * @return Quote
  40. * @throws LocalizedException if payment method can not be configured for a quote.
  41. * @since 100.2.0
  42. */
  43. public function configurePayment(
  44. Quote $quote,
  45. PaymentTokenInterface $paymentToken
  46. ): Quote {
  47. $paymentMethod = $this->getVaultPaymentMethodCode(
  48. $paymentToken,
  49. $quote->getStoreId()
  50. );
  51. $payment = $quote->getPayment();
  52. $payment->setQuote($quote);
  53. $payment->importData(['method' => $paymentMethod]);
  54. $payment->setAdditionalInformation($this->buildPaymentAdditionalInformation(
  55. $paymentToken,
  56. $quote->getStoreId()
  57. ));
  58. return $quote;
  59. }
  60. /**
  61. * Detects vault payment method code based on provider payment method code.
  62. *
  63. * @param PaymentTokenInterface $paymentToken
  64. * @param int $storeId
  65. * @return string
  66. * @throws LocalizedException if payment not available
  67. */
  68. private function getVaultPaymentMethodCode(PaymentTokenInterface $paymentToken, int $storeId): string
  69. {
  70. try {
  71. $integration = $this->integrationManager->getByToken($paymentToken, $storeId);
  72. $vaultPaymentMethodCode = $integration->getVaultCode();
  73. return $vaultPaymentMethodCode;
  74. } catch (LocalizedException $e) {
  75. throw new LocalizedException(__('Specified payment method is not available now.'), $e);
  76. }
  77. }
  78. /**
  79. * Builds payment additional information based on token.
  80. *
  81. * @param PaymentTokenInterface $paymentToken
  82. * @param int $storeId
  83. * @return array
  84. */
  85. private function buildPaymentAdditionalInformation(PaymentTokenInterface $paymentToken, int $storeId): array
  86. {
  87. $common = [
  88. PaymentTokenInterface::CUSTOMER_ID => $paymentToken->getCustomerId(),
  89. PaymentTokenInterface::PUBLIC_HASH => $paymentToken->getPublicHash(),
  90. VaultConfigProvider::IS_ACTIVE_CODE => true,
  91. // mark payment
  92. self::MARKER => 'true',
  93. ];
  94. $integration = $this->integrationManager->getByToken($paymentToken, $storeId);
  95. $specific = $integration->getAdditionalInformation($paymentToken);
  96. $additionalInformation = array_merge($common, $specific);
  97. return $additionalInformation;
  98. }
  99. }