PaymentTokenManagement.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Vault\Model;
  7. use Magento\Framework\Api\FilterBuilder;
  8. use Magento\Framework\Api\SearchCriteriaBuilder;
  9. use Magento\Framework\Encryption\EncryptorInterface;
  10. use Magento\Framework\Intl\DateTimeFactory;
  11. use Magento\Sales\Api\Data\OrderPaymentInterface;
  12. use Magento\Sales\Model\Order\Payment;
  13. use Magento\Vault\Api\Data;
  14. use Magento\Vault\Api\Data\PaymentTokenInterface;
  15. use Magento\Vault\Api\Data\PaymentTokenSearchResultsInterfaceFactory;
  16. use Magento\Vault\Api\PaymentTokenManagementInterface;
  17. use Magento\Vault\Api\PaymentTokenRepositoryInterface;
  18. use Magento\Vault\Model\ResourceModel\PaymentToken as PaymentTokenResourceModel;
  19. /**
  20. * Vault payment token repository
  21. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  22. */
  23. class PaymentTokenManagement implements PaymentTokenManagementInterface
  24. {
  25. /**
  26. * @var PaymentTokenRepositoryInterface
  27. */
  28. protected $paymentTokenRepository;
  29. /**
  30. * @var PaymentTokenResourceModel
  31. */
  32. protected $paymentTokenResourceModel;
  33. /**
  34. * @var PaymentTokenResourceModel
  35. */
  36. protected $resourceModel;
  37. /**
  38. * @var PaymentTokenFactory
  39. */
  40. protected $paymentTokenFactory;
  41. /**
  42. * @var PaymentTokenSearchResultsInterfaceFactory
  43. */
  44. protected $searchResultsFactory;
  45. /**
  46. * @var \Magento\Framework\Api\FilterBuilder
  47. */
  48. protected $filterBuilder;
  49. /**
  50. * @var \Magento\Framework\Api\SearchCriteriaBuilder
  51. */
  52. protected $searchCriteriaBuilder;
  53. /**
  54. * @var EncryptorInterface
  55. */
  56. private $encryptor;
  57. /**
  58. * @var DateTimeFactory
  59. */
  60. private $dateTimeFactory;
  61. /**
  62. * @param PaymentTokenRepositoryInterface $repository
  63. * @param PaymentTokenResourceModel $paymentTokenResourceModel
  64. * @param PaymentTokenFactory $paymentTokenFactory
  65. * @param FilterBuilder $filterBuilder
  66. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  67. * @param PaymentTokenSearchResultsInterfaceFactory $searchResultsFactory
  68. * @param EncryptorInterface $encryptor
  69. * @param DateTimeFactory $dateTimeFactory
  70. */
  71. public function __construct(
  72. PaymentTokenRepositoryInterface $repository,
  73. PaymentTokenResourceModel $paymentTokenResourceModel,
  74. PaymentTokenFactory $paymentTokenFactory,
  75. FilterBuilder $filterBuilder,
  76. SearchCriteriaBuilder $searchCriteriaBuilder,
  77. PaymentTokenSearchResultsInterfaceFactory $searchResultsFactory,
  78. EncryptorInterface $encryptor,
  79. DateTimeFactory $dateTimeFactory
  80. ) {
  81. $this->paymentTokenRepository = $repository;
  82. $this->paymentTokenResourceModel = $paymentTokenResourceModel;
  83. $this->paymentTokenFactory = $paymentTokenFactory;
  84. $this->filterBuilder = $filterBuilder;
  85. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  86. $this->searchResultsFactory = $searchResultsFactory;
  87. $this->encryptor = $encryptor;
  88. $this->dateTimeFactory = $dateTimeFactory;
  89. }
  90. /**
  91. * Lists payment tokens that match specified search criteria.
  92. *
  93. * @param int $customerId Customer ID.
  94. * @return \Magento\Vault\Api\Data\PaymentTokenSearchResultsInterface[] Payment tokens search result interface.
  95. */
  96. public function getListByCustomerId($customerId)
  97. {
  98. $filters[] = $this->filterBuilder
  99. ->setField(PaymentTokenInterface::CUSTOMER_ID)
  100. ->setValue($customerId)
  101. ->create();
  102. $entities = $this->paymentTokenRepository->getList(
  103. $this->searchCriteriaBuilder
  104. ->addFilters($filters)
  105. ->create()
  106. )->getItems();
  107. return $entities;
  108. }
  109. /**
  110. * Searches for all visible, non-expired tokens
  111. *
  112. * @param int $customerId
  113. * @return Data\PaymentTokenInterface[]
  114. */
  115. public function getVisibleAvailableTokens($customerId)
  116. {
  117. $customerFilter = [
  118. $this->filterBuilder->setField(PaymentTokenInterface::CUSTOMER_ID)
  119. ->setValue($customerId)
  120. ->create()
  121. ];
  122. $visibleFilter = [
  123. $this->filterBuilder->setField(PaymentTokenInterface::IS_VISIBLE)
  124. ->setValue(1)
  125. ->create()
  126. ];
  127. $isActiveFilter = [
  128. $this->filterBuilder->setField(PaymentTokenInterface::IS_ACTIVE)
  129. ->setValue(1)
  130. ->create()
  131. ];
  132. $expiresAtFilter = [
  133. $this->filterBuilder->setField(PaymentTokenInterface::EXPIRES_AT)
  134. ->setConditionType('gt')
  135. ->setValue(
  136. $this->dateTimeFactory->create(
  137. 'now',
  138. new \DateTimeZone('UTC')
  139. )->format('Y-m-d 00:00:00')
  140. )
  141. ->create()
  142. ];
  143. $this->searchCriteriaBuilder->addFilters($customerFilter);
  144. $this->searchCriteriaBuilder->addFilters($visibleFilter);
  145. $this->searchCriteriaBuilder->addFilters($isActiveFilter);
  146. // add filters to different filter groups in order to filter by AND expression
  147. $searchCriteria = $this->searchCriteriaBuilder->addFilters($expiresAtFilter)->create();
  148. return $this->paymentTokenRepository->getList($searchCriteria)->getItems();
  149. }
  150. /**
  151. * Get payment token by token Id.
  152. *
  153. * @param int $paymentId The payment token ID.
  154. * @return PaymentTokenInterface|null Payment token interface.
  155. */
  156. public function getByPaymentId($paymentId)
  157. {
  158. $tokenData = $this->paymentTokenResourceModel->getByOrderPaymentId($paymentId);
  159. $tokenModel = !empty($tokenData) ? $this->paymentTokenFactory->create(['data' => $tokenData]) : null;
  160. return $tokenModel;
  161. }
  162. /**
  163. * Get payment token by gateway token.
  164. *
  165. * @param string $token The gateway token.
  166. * @param string $paymentMethodCode
  167. * @param int $customerId Customer ID.
  168. * @return PaymentTokenInterface|null Payment token interface.
  169. */
  170. public function getByGatewayToken($token, $paymentMethodCode, $customerId)
  171. {
  172. $tokenData = $this->paymentTokenResourceModel->getByGatewayToken($token, $paymentMethodCode, $customerId);
  173. $tokenModel = !empty($tokenData) ? $this->paymentTokenFactory->create(['data' => $tokenData]) : null;
  174. return $tokenModel;
  175. }
  176. /**
  177. * Get payment token by public hash.
  178. *
  179. * @param string $hash Public hash.
  180. * @param int $customerId Customer ID.
  181. * @return PaymentTokenInterface|null Payment token interface.
  182. */
  183. public function getByPublicHash($hash, $customerId)
  184. {
  185. $tokenData = $this->paymentTokenResourceModel->getByPublicHash($hash, $customerId);
  186. $tokenModel = !empty($tokenData) ? $this->paymentTokenFactory->create(['data' => $tokenData]) : null;
  187. return $tokenModel;
  188. }
  189. /**
  190. * @param PaymentTokenInterface $token
  191. * @param OrderPaymentInterface $payment
  192. * @return bool
  193. */
  194. public function saveTokenWithPaymentLink(PaymentTokenInterface $token, OrderPaymentInterface $payment)
  195. {
  196. $tokenDuplicate = $this->getByPublicHash(
  197. $token->getPublicHash(),
  198. $token->getCustomerId()
  199. );
  200. if (!empty($tokenDuplicate)) {
  201. if ($token->getIsVisible() || $tokenDuplicate->getIsVisible()) {
  202. $token->setEntityId($tokenDuplicate->getEntityId());
  203. $token->setIsVisible(true);
  204. } elseif ($token->getIsVisible() === $tokenDuplicate->getIsVisible()) {
  205. $token->setEntityId($tokenDuplicate->getEntityId());
  206. } else {
  207. $token->setPublicHash(
  208. $this->encryptor->getHash(
  209. $token->getPublicHash() . $token->getGatewayToken()
  210. )
  211. );
  212. }
  213. }
  214. $this->paymentTokenRepository->save($token);
  215. $result = $this->addLinkToOrderPayment($token->getEntityId(), $payment->getEntityId());
  216. return $result;
  217. }
  218. /**
  219. * Add link between payment token and order payment.
  220. *
  221. * @param int $paymentTokenId Payment token ID.
  222. * @param int $orderPaymentId Order payment ID.
  223. * @return bool
  224. */
  225. public function addLinkToOrderPayment($paymentTokenId, $orderPaymentId)
  226. {
  227. return $this->paymentTokenResourceModel->addLinkToOrderPayment($paymentTokenId, $orderPaymentId);
  228. }
  229. }