/**
  * @param Observer $observer
  * @return void
  */
 public function execute(Observer $observer)
 {
     $dataObject = $this->readDataArgument($observer);
     $additionalData = $dataObject->getData(PaymentInterface::KEY_ADDITIONAL_DATA);
     if (!is_array($additionalData) || !isset($additionalData[PaymentTokenInterface::PUBLIC_HASH])) {
         return;
     }
     $tokenPublicHash = $additionalData[PaymentTokenInterface::PUBLIC_HASH];
     if ($tokenPublicHash === null) {
         return;
     }
     /** @var Payment $paymentModel */
     $paymentModel = $this->readPaymentModelArgument($observer);
     if (!$paymentModel instanceof Payment) {
         return;
     }
     $quote = $paymentModel->getQuote();
     $customerId = $quote->getCustomer()->getId();
     if ($customerId === null) {
         return;
     }
     $paymentToken = $this->paymentTokenManagement->getByPublicHash($tokenPublicHash, $customerId);
     if ($paymentToken === null) {
         return;
     }
     $paymentModel->setAdditionalInformation(Vault::TOKEN_METADATA_KEY, [PaymentTokenInterface::CUSTOMER_ID => $customerId, PaymentTokenInterface::PUBLIC_HASH => $tokenPublicHash]);
 }
 /**
  * Create payment vault record
  *
  * @param Observer $observer
  * @return $this
  */
 public function execute(Observer $observer)
 {
     /** @var OrderPaymentInterface $payment */
     $payment = $observer->getDataByKey(self::PAYMENT_OBJECT_DATA_KEY);
     $extensionAttributes = $payment->getExtensionAttributes();
     $paymentToken = $this->getPaymentToken($extensionAttributes);
     if ($paymentToken === null) {
         return $this;
     }
     if ($paymentToken->getEntityId() !== null) {
         $this->paymentTokenManagement->addLinkToOrderPayment($paymentToken->getEntityId(), $payment->getEntityId());
         return $this;
     }
     $order = $payment->getOrder();
     $paymentToken->setCustomerId($order->getCustomerId());
     $paymentToken->setIsActive(true);
     $paymentToken->setPaymentMethodCode($payment->getMethod());
     $additionalInformation = $payment->getAdditionalInformation();
     if (isset($additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE])) {
         $paymentToken->setIsVisible((bool) (int) $additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE]);
     }
     $paymentToken->setPublicHash($this->generatePublicHash($paymentToken));
     $this->paymentTokenManagement->saveTokenWithPaymentLink($paymentToken, $payment);
     $extensionAttributes->setVaultPaymentToken($paymentToken);
     return $this;
 }
 /**
  * @inheritdoc
  * @throws \Exception
  */
 public function execute(array $commandSubject)
 {
     $publicHash = $this->subjectReader->readPublicHash($commandSubject);
     $customerId = $this->subjectReader->readCustomerId($commandSubject);
     $paymentToken = $this->tokenManagement->getByPublicHash($publicHash, $customerId);
     if (!$paymentToken) {
         throw new Exception('No available payment tokens');
     }
     $data = $this->adapter->createNonce($paymentToken->getGatewayToken());
     $result = $this->responseValidator->validate(['response' => ['object' => $data]]);
     if (!$result->isValid()) {
         throw new Exception(__(implode("\n", $result->getFailsDescription())));
     }
     return $this->resultFactory->create(['array' => ['paymentMethodNonce' => $data->paymentMethodNonce->nonce]]);
 }
 /**
  * Load vault payment extension attribute to order/payment entity
  *
  * @param OrderPaymentInterface $payment
  * @param \Closure $proceed
  * @return OrderPaymentExtensionInterface
  */
 public function aroundGetExtensionAttributes(OrderPaymentInterface $payment, \Closure $proceed)
 {
     /** @var OrderPaymentExtensionInterface $paymentExtension */
     $paymentExtension = $proceed();
     if ($paymentExtension === null) {
         $paymentExtension = $this->paymentExtensionFactory->create();
     }
     $paymentToken = $paymentExtension->getVaultPaymentToken();
     if ($paymentToken === null) {
         $paymentToken = $this->paymentTokenManagement->getByPaymentId($payment->getEntityId());
         $paymentExtension->setVaultPaymentToken($paymentToken);
         $payment->setExtensionAttributes($paymentExtension);
     }
     return $paymentExtension;
 }
 /**
  * Create payment vault record
  *
  * @param Observer $observer
  * @return $this
  */
 public function execute(Observer $observer)
 {
     /** @var OrderPaymentInterface $payment */
     $payment = $observer->getDataByKey(self::PAYMENT_OBJECT_DATA_KEY);
     $extensionAttributes = $payment->getExtensionAttributes();
     $paymentToken = $this->getPaymentToken($extensionAttributes);
     // Save only new tokens that has been set during first order placement
     if ($paymentToken === null || $paymentToken->getEntityId() > 0) {
         return $this;
     }
     $paymentToken->setPublicHash($this->generatePublicHash($paymentToken));
     $paymentToken->setIsActive(true);
     $additionalInformation = $payment->getAdditionalInformation();
     if (isset($additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE])) {
         $paymentToken->setIsVisible((bool) (int) $additionalInformation[VaultConfigProvider::IS_ACTIVE_CODE]);
     }
     $this->paymentTokenManagement->saveTokenWithPaymentLink($paymentToken, $payment);
     $extensionAttributes->setVaultPaymentToken($paymentToken);
     return $this;
 }
 /**
  * @param OrderPaymentInterface $orderPayment
  * @return void
  */
 private function attachTokenExtensionAttribute(OrderPaymentInterface $orderPayment)
 {
     $additionalInformation = $orderPayment->getAdditionalInformation();
     $tokenData = isset($additionalInformation[self::TOKEN_METADATA_KEY]) ? $additionalInformation[self::TOKEN_METADATA_KEY] : null;
     if ($tokenData === null) {
         throw new \LogicException("Token metadata should be defined");
     }
     $customerId = $tokenData[PaymentTokenInterface::CUSTOMER_ID];
     $publicHash = $tokenData[PaymentTokenInterface::PUBLIC_HASH];
     $paymentToken = $this->tokenManagement->getByPublicHash($publicHash, $customerId);
     if ($paymentToken === null) {
         throw new \LogicException("No token found");
     }
     $extensionAttributes = $this->getPaymentExtensionAttributes($orderPayment);
     $extensionAttributes->setVaultPaymentToken($paymentToken);
 }
 public function testExecuteSaveMetadata()
 {
     $customerId = 1;
     $publicHash = 'public_hash_value';
     $dataObject = new DataObject([PaymentInterface::KEY_ADDITIONAL_DATA => [PaymentTokenInterface::PUBLIC_HASH => $publicHash]]);
     $paymentModel = $this->getMockBuilder(Payment::class)->disableOriginalConstructor()->getMock();
     $quote = $this->getMock(CartInterface::class);
     $customer = $this->getMock(CustomerInterface::class);
     $paymentToken = $this->getMock(PaymentTokenInterface::class);
     $paymentModel->expects(static::once())->method('getQuote')->willReturn($quote);
     $quote->expects(static::once())->method('getCustomer')->willReturn($customer);
     $customer->expects(static::once())->method('getId')->willReturn($customerId);
     $this->paymentTokenManagement->expects(static::once())->method('getByPublicHash')->with($publicHash, $customerId)->willReturn($paymentToken);
     $paymentModel->expects(static::once())->method('setAdditionalInformation')->with(Vault::TOKEN_METADATA_KEY, [PaymentTokenInterface::CUSTOMER_ID => $customerId, PaymentTokenInterface::PUBLIC_HASH => $publicHash]);
     $observer = $this->getPreparedObserverWithMap([[AbstractDataAssignObserver::DATA_CODE, $dataObject], [AbstractDataAssignObserver::MODEL_CODE, $paymentModel]]);
     $this->observer->execute($observer);
 }