ExpressConfigProvider.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Paypal\Model;
  7. use Magento\Checkout\Model\ConfigProviderInterface;
  8. use Magento\Framework\Locale\ResolverInterface;
  9. use Magento\Customer\Helper\Session\CurrentCustomer;
  10. use Magento\Framework\UrlInterface;
  11. use Magento\Payment\Helper\Data as PaymentHelper;
  12. use Magento\Paypal\Helper\Data as PaypalHelper;
  13. /**
  14. * Class ExpressConfigProvider
  15. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  16. */
  17. class ExpressConfigProvider implements ConfigProviderInterface
  18. {
  19. const IN_CONTEXT_BUTTON_ID = 'paypal-express-in-context-button';
  20. /**
  21. * @var ResolverInterface
  22. */
  23. protected $localeResolver;
  24. /**
  25. * @var Config
  26. */
  27. protected $config;
  28. /**
  29. * @var \Magento\Customer\Helper\Session\CurrentCustomer
  30. */
  31. protected $currentCustomer;
  32. /**
  33. * @var PaypalHelper
  34. */
  35. protected $paypalHelper;
  36. /**
  37. * @var string[]
  38. */
  39. protected $methodCodes = [
  40. Config::METHOD_WPP_BML,
  41. Config::METHOD_WPP_PE_EXPRESS,
  42. Config::METHOD_WPP_EXPRESS,
  43. Config::METHOD_WPP_PE_BML
  44. ];
  45. /**
  46. * @var \Magento\Payment\Model\Method\AbstractMethod[]
  47. */
  48. protected $methods = [];
  49. /**
  50. * @var PaymentHelper
  51. */
  52. protected $paymentHelper;
  53. /**
  54. * @var UrlInterface
  55. */
  56. protected $urlBuilder;
  57. /**
  58. * @var SmartButtonConfig
  59. */
  60. private $smartButtonConfig;
  61. /**
  62. * ExpressConfigProvider constructor.
  63. * @param ConfigFactory $configFactory
  64. * @param ResolverInterface $localeResolver
  65. * @param CurrentCustomer $currentCustomer
  66. * @param PaypalHelper $paypalHelper
  67. * @param PaymentHelper $paymentHelper
  68. * @param UrlInterface $urlBuilder
  69. * @param SmartButtonConfig|null $smartButtonConfig
  70. * @throws \Magento\Framework\Exception\LocalizedException
  71. */
  72. public function __construct(
  73. ConfigFactory $configFactory,
  74. ResolverInterface $localeResolver,
  75. CurrentCustomer $currentCustomer,
  76. PaypalHelper $paypalHelper,
  77. PaymentHelper $paymentHelper,
  78. UrlInterface $urlBuilder,
  79. SmartButtonConfig $smartButtonConfig
  80. ) {
  81. $this->localeResolver = $localeResolver;
  82. $this->config = $configFactory->create();
  83. $this->currentCustomer = $currentCustomer;
  84. $this->paypalHelper = $paypalHelper;
  85. $this->paymentHelper = $paymentHelper;
  86. $this->urlBuilder = $urlBuilder;
  87. $this->smartButtonConfig = $smartButtonConfig;
  88. foreach ($this->methodCodes as $code) {
  89. $this->methods[$code] = $this->paymentHelper->getMethodInstance($code);
  90. }
  91. }
  92. /**
  93. * @inheritdoc
  94. */
  95. public function getConfig()
  96. {
  97. $locale = $this->localeResolver->getLocale();
  98. $config = [
  99. 'payment' => [
  100. 'paypalExpress' => [
  101. 'paymentAcceptanceMarkHref' => $this->config->getPaymentMarkWhatIsPaypalUrl(
  102. $this->localeResolver
  103. ),
  104. 'paymentAcceptanceMarkSrc' => $this->config->getPaymentMarkImageUrl(
  105. $locale
  106. ),
  107. 'isContextCheckout' => false,
  108. 'inContextConfig' => []
  109. ]
  110. ]
  111. ];
  112. $isInContext = $this->isInContextCheckout();
  113. if ($isInContext) {
  114. $config['payment']['paypalExpress']['isContextCheckout'] = $isInContext;
  115. $config['payment']['paypalExpress']['inContextConfig'] = [
  116. 'inContextId' => self::IN_CONTEXT_BUTTON_ID,
  117. 'merchantId' => $this->config->getValue('merchant_id'),
  118. ];
  119. $clientConfig = [
  120. 'button' => [
  121. self::IN_CONTEXT_BUTTON_ID
  122. ],
  123. 'getTokenUrl' => $this->urlBuilder->getUrl('paypal/express/getTokenData'),
  124. 'onAuthorizeUrl' => $this->urlBuilder->getUrl('paypal/express/onAuthorization'),
  125. 'onCancelUrl' => $this->urlBuilder->getUrl('paypal/express/cancel')
  126. ];
  127. $clientConfig = array_replace_recursive($clientConfig, $this->smartButtonConfig->getConfig('checkout'));
  128. $config['payment']['paypalExpress']['inContextConfig']['clientConfig'] = $clientConfig;
  129. }
  130. foreach ($this->methodCodes as $code) {
  131. if ($this->methods[$code]->isAvailable()) {
  132. $config['payment']['paypalExpress']['redirectUrl'][$code] = $this->getMethodRedirectUrl($code);
  133. $config['payment']['paypalExpress']['billingAgreementCode'][$code] =
  134. $this->getBillingAgreementCode($code);
  135. }
  136. }
  137. return $config;
  138. }
  139. /**
  140. * Return setting value for in context checkout
  141. *
  142. * @return bool
  143. */
  144. protected function isInContextCheckout()
  145. {
  146. $this->config->setMethod(Config::METHOD_EXPRESS);
  147. return (bool)(int) $this->config->getValue('in_context');
  148. }
  149. /**
  150. * Return redirect URL for method
  151. *
  152. * @param string $code
  153. * @return mixed
  154. */
  155. protected function getMethodRedirectUrl($code)
  156. {
  157. return $this->methods[$code]->getCheckoutRedirectUrl();
  158. }
  159. /**
  160. * Return billing agreement code for method
  161. *
  162. * @param string $code
  163. * @return null|string
  164. */
  165. protected function getBillingAgreementCode($code)
  166. {
  167. $customerId = $this->currentCustomer->getCustomerId();
  168. $this->config->setMethod($code);
  169. return $this->paypalHelper->shouldAskToCreateBillingAgreement($this->config, $customerId)
  170. ? Express\Checkout::PAYMENT_INFO_TRANSPORT_BILLING_AGREEMENT : null;
  171. }
  172. }