/** * @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); }