ThreeDSecureDataBuilder.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Braintree\Gateway\Request;
  7. use Magento\Braintree\Gateway\Config\Config;
  8. use Magento\Payment\Gateway\Data\OrderAdapterInterface;
  9. use Magento\Braintree\Gateway\SubjectReader;
  10. use Magento\Payment\Gateway\Request\BuilderInterface;
  11. use Magento\Payment\Helper\Formatter;
  12. /**
  13. * Class ThreeDSecureDataBuilder
  14. */
  15. class ThreeDSecureDataBuilder implements BuilderInterface
  16. {
  17. use Formatter;
  18. /**
  19. * @var Config
  20. */
  21. private $config;
  22. /**
  23. * @var SubjectReader
  24. */
  25. private $subjectReader;
  26. /**
  27. * Constructor
  28. *
  29. * @param Config $config
  30. * @param SubjectReader $subjectReader
  31. */
  32. public function __construct(Config $config, SubjectReader $subjectReader)
  33. {
  34. $this->config = $config;
  35. $this->subjectReader = $subjectReader;
  36. }
  37. /**
  38. * @inheritdoc
  39. */
  40. public function build(array $buildSubject)
  41. {
  42. $result = [];
  43. $paymentDO = $this->subjectReader->readPayment($buildSubject);
  44. $amount = $this->formatPrice($this->subjectReader->readAmount($buildSubject));
  45. if ($this->is3DSecureEnabled($paymentDO->getOrder(), $amount)) {
  46. $result['options'][Config::CODE_3DSECURE] = ['required' => true];
  47. }
  48. return $result;
  49. }
  50. /**
  51. * Check if 3d secure is enabled
  52. * @param OrderAdapterInterface $order
  53. * @param float $amount
  54. * @return bool
  55. */
  56. private function is3DSecureEnabled(OrderAdapterInterface $order, $amount)
  57. {
  58. $storeId = $order->getStoreId();
  59. if (!$this->config->isVerify3DSecure($storeId)
  60. || $amount < $this->config->getThresholdAmount($storeId)
  61. ) {
  62. return false;
  63. }
  64. $billingAddress = $order->getBillingAddress();
  65. $specificCounties = $this->config->get3DSecureSpecificCountries($storeId);
  66. if (!empty($specificCounties) && !in_array($billingAddress->getCountryId(), $specificCounties)) {
  67. return false;
  68. }
  69. return true;
  70. }
  71. }