AfterPaymentSaveObserver.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Vault\Observer;
  7. use Magento\Framework\Encryption\EncryptorInterface;
  8. use Magento\Framework\Event\Observer;
  9. use Magento\Framework\Event\ObserverInterface;
  10. use Magento\Sales\Api\Data\OrderPaymentExtensionInterface;
  11. use Magento\Sales\Api\Data\OrderPaymentInterface;
  12. use Magento\Vault\Api\Data\PaymentTokenInterface;
  13. use Magento\Vault\Api\PaymentTokenManagementInterface;
  14. use Magento\Vault\Model\Ui\VaultConfigProvider;
  15. /**
  16. * Order payment after save observer for storing payment vault record in db
  17. */
  18. class AfterPaymentSaveObserver implements ObserverInterface
  19. {
  20. const PAYMENT_OBJECT_DATA_KEY = 'payment';
  21. /**
  22. * @var PaymentTokenManagementInterface
  23. */
  24. protected $paymentTokenManagement;
  25. /**
  26. * @var EncryptorInterface
  27. */
  28. protected $encryptor;
  29. /**
  30. * @param PaymentTokenManagementInterface $paymentTokenManagement
  31. * @param EncryptorInterface $encryptor
  32. */
  33. public function __construct(
  34. PaymentTokenManagementInterface $paymentTokenManagement,
  35. EncryptorInterface $encryptor
  36. ) {
  37. $this->paymentTokenManagement = $paymentTokenManagement;
  38. $this->encryptor = $encryptor;
  39. }
  40. /**
  41. * Create payment vault record
  42. *
  43. * @param Observer $observer
  44. * @return $this
  45. */
  46. public function execute(Observer $observer)
  47. {
  48. /** @var OrderPaymentInterface $payment */
  49. $payment = $observer->getDataByKey(self::PAYMENT_OBJECT_DATA_KEY);
  50. $extensionAttributes = $payment->getExtensionAttributes();
  51. $paymentToken = $this->getPaymentToken($extensionAttributes);
  52. if ($paymentToken === null) {
  53. return $this;
  54. }
  55. if ($paymentToken->getEntityId() !== null) {
  56. $this->paymentTokenManagement->addLinkToOrderPayment(
  57. $paymentToken->getEntityId(),
  58. $payment->getEntityId()
  59. );
  60. return $this;
  61. }
  62. $order = $payment->getOrder();
  63. $paymentToken->setCustomerId($order->getCustomerId());
  64. $paymentToken->setIsActive(true);
  65. $paymentToken->setPaymentMethodCode($payment->getMethod());
  66. $additionalInformation = $payment->getAdditionalInformation();
  67. if (isset($additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE])) {
  68. $paymentToken->setIsVisible(
  69. (bool) (int) $additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE]
  70. );
  71. }
  72. $paymentToken->setPublicHash($this->generatePublicHash($paymentToken));
  73. $this->paymentTokenManagement->saveTokenWithPaymentLink($paymentToken, $payment);
  74. $extensionAttributes->setVaultPaymentToken($paymentToken);
  75. return $this;
  76. }
  77. /**
  78. * Generate vault payment public hash
  79. *
  80. * @param PaymentTokenInterface $paymentToken
  81. * @return string
  82. */
  83. protected function generatePublicHash(PaymentTokenInterface $paymentToken)
  84. {
  85. $hashKey = $paymentToken->getGatewayToken();
  86. if ($paymentToken->getCustomerId()) {
  87. $hashKey = $paymentToken->getCustomerId();
  88. }
  89. $hashKey .= $paymentToken->getPaymentMethodCode()
  90. . $paymentToken->getType()
  91. . $paymentToken->getTokenDetails();
  92. return $this->encryptor->getHash($hashKey);
  93. }
  94. /**
  95. * Reads Payment token from Order Payment
  96. *
  97. * @param OrderPaymentExtensionInterface | null $extensionAttributes
  98. * @return PaymentTokenInterface | null
  99. */
  100. protected function getPaymentToken(OrderPaymentExtensionInterface $extensionAttributes = null)
  101. {
  102. if (null === $extensionAttributes) {
  103. return null;
  104. }
  105. /** @var PaymentTokenInterface $paymentToken */
  106. $paymentToken = $extensionAttributes->getVaultPaymentToken();
  107. if (null === $paymentToken || empty($paymentToken->getGatewayToken())) {
  108. return null;
  109. }
  110. return $paymentToken;
  111. }
  112. }