/** * Authorizes payment. * * @param OrderPaymentInterface $payment * @param bool $isOnline * @param string|float $amount * @return OrderPaymentInterface */ public function authorize(OrderPaymentInterface $payment, $isOnline, $amount) { // check for authorization amount to be equal to grand total /** * @var $payment Payment */ $payment->setShouldCloseParentTransaction(false); $isSameCurrency = $payment->isSameCurrency(); if (!$isSameCurrency || !$payment->isCaptureFinal($amount)) { $payment->setIsFraudDetected(true); } // update totals $amount = $payment->formatAmount($amount, true); $payment->setBaseAmountAuthorized($amount); // do authorization $order = $payment->getOrder(); if ($isOnline) { // invoke authorization on gateway $method = $payment->getMethodInstance(); $method->setStore($order->getStoreId()); $method->authorize($payment, $amount); } $message = $this->stateCommand->execute($payment, $amount, $order); // update transactions, order state and add comments $transaction = $payment->addTransaction(Transaction::TYPE_AUTH); $message = $payment->prependMessage($message); $payment->addTransactionCommentsToOrder($transaction, $message); return $payment; }
/** * Registers capture notification. * * @param OrderPaymentInterface $payment * @param string|float $amount * @param bool|int $skipFraudDetection * @return OrderPaymentInterface */ public function registerCaptureNotification(OrderPaymentInterface $payment, $amount, $skipFraudDetection = false) { /** * @var $payment Payment */ $payment->setTransactionId($this->transactionManager->generateTransactionId($payment, Transaction::TYPE_CAPTURE, $payment->getAuthorizationTransaction())); $order = $payment->getOrder(); $amount = (double) $amount; $invoice = $this->getInvoiceForTransactionId($order, $payment->getTransactionId()); // register new capture if (!$invoice) { if ($payment->isSameCurrency() && $payment->isCaptureFinal($amount)) { $invoice = $order->prepareInvoice()->register(); $invoice->setOrder($order); $order->addRelatedObject($invoice); $payment->setCreatedInvoice($invoice); } else { $payment->setIsFraudDetected(!$skipFraudDetection); $this->updateTotals($payment, ['base_amount_paid_online' => $amount]); } } if (!$payment->getIsTransactionPending()) { if ($invoice && Invoice::STATE_OPEN == $invoice->getState()) { $invoice->setOrder($order); $invoice->pay(); $this->updateTotals($payment, ['base_amount_paid_online' => $amount]); $order->addRelatedObject($invoice); } } $message = $this->stateCommand->execute($payment, $amount, $order); $transaction = $payment->addTransaction(Transaction::TYPE_CAPTURE, $invoice, true); $message = $payment->prependMessage($message); $payment->addTransactionCommentsToOrder($transaction, $message); return $payment; }
/** * Totals updater utility method * Updates self totals by keys in data array('key' => $delta) * * @param OrderPaymentInterface $payment * @param array $data * @return void */ protected function updateTotals(OrderPaymentInterface $payment, $data) { foreach ($data as $key => $amount) { if (null !== $amount) { $was = $payment->getDataUsingMethod($key); $payment->setDataUsingMethod($key, $was + $amount); } } }
/** @inheritdoc */ public function getBusCodeForPaymentMethod(\Magento\Sales\Api\Data\OrderPaymentInterface $payment) { $result = null; $mage = $payment->getMethod(); if ($mage == self::M_PAY_BRAINTREE) { $result = self::B_PAY_BRAINTREE; } elseif ($mage == self::M_PAY_CHECK_MONEY) { $result = self::B_PAY_CHECK_MONEY; } elseif ($mage == self::M_PAY_INTERNAL_MONEY) { $result = self::B_PAY_INTERNAL_MONEY; } return $result; }
/** * 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; }
/** * Run command * * @param OrderPaymentInterface $payment * @param string|float|int $amount * @param OrderInterface $order * @return string */ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order) { $state = Order::STATE_PROCESSING; $status = false; $formattedAmount = $order->getBaseCurrency()->formatTxt($amount); if ($payment->getIsTransactionPending()) { $message = __('The order amount of %1 is pending approval on the payment gateway.', $formattedAmount); $state = Order::STATE_PAYMENT_REVIEW; if ($payment->getIsFraudDetected()) { $status = Order::STATUS_FRAUD; } } else { $message = __('Ordered amount of %1', $formattedAmount); } $this->setOrderStateAndStatus($order, $status, $state); return $message; }
/** * Run command * * @param OrderPaymentInterface $payment * @param string|float|int $amount * @param OrderInterface $order * @return string */ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order) { $state = SalesOrder::STATE_PROCESSING; $status = false; $formattedAmount = $order->getBaseCurrency()->formatTxt($amount); if ($payment->getIsTransactionPending()) { $message = __('An amount of %1 will be captured after being approved at the payment gateway.', $formattedAmount); $state = SalesOrder::STATE_PAYMENT_REVIEW; if ($payment->getIsFraudDetected()) { $status = SalesOrder::STATUS_FRAUD; } } else { // normal online capture: invoice is marked as "paid" $message = __('Captured amount of %1 online', $formattedAmount); } $this->setOrderStateAndStatus($order, $status, $state); return $message; }
/** * @param OrderPaymentInterface $payment * @param string|float $amount * @return OrderPaymentInterface */ public function order(OrderPaymentInterface $payment, $amount) { /** * @var $payment Payment */ // update totals $amount = $payment->formatAmount($amount, true); // do ordering $order = $payment->getOrder(); $method = $payment->getMethodInstance(); $method->setStore($order->getStoreId()); $method->order($payment, $amount); if ($payment->getSkipOrderProcessing()) { return $payment; } $message = $this->stateCommand->execute($payment, $amount, $order); // update transactions, order state and add comments $transaction = $payment->addTransaction(Transaction::TYPE_ORDER); $message = $payment->prependMessage($message); $payment->addTransactionCommentsToOrder($transaction, $message); return $payment; }
/** * Decrease captured amount for partial payments. * * @param \Magento\Sales\Model\Order\Payment\Processor $subject * @param \Closure $proceed * @param \Magento\Sales\Api\Data\OrderPaymentInterface $payment * @param \Magento\Sales\Api\Data\InvoiceInterface|null $invoice * @return \Magento\Sales\Api\Data\OrderPaymentInterface */ public function aroundCapture(\Magento\Sales\Model\Order\Payment\Processor $subject, \Closure $proceed, \Magento\Sales\Api\Data\OrderPaymentInterface $payment, \Magento\Sales\Api\Data\InvoiceInterface $invoice = null) { if ($invoice) { /* try to find related record in quote registry */ $order = $payment->getOrder(); $quoteId = $order->getQuoteId(); $found = $this->_repoPartialQuote->getById($quoteId); if ($found) { /* decrease amount in invoice */ $partialBase = $found->getBasePartialAmount(); $partial = $found->getPartialAmount(); $grandTotalBase = $invoice->getBaseGrandTotal(); $grandTotal = $invoice->getGrandTotal(); $grandTotalBase -= $partialBase; $grandTotal -= $partial; $invoice->setBaseGrandTotal($grandTotalBase); $invoice->setGrandTotal($grandTotal); } } $result = $proceed($payment, $invoice); return $result; }
/** * @param OrderPaymentInterface $payment * @param string|float $amount * @param OrderInterface $order * @return \Magento\Framework\Phrase */ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order) { $state = Order::STATE_PROCESSING; $status = false; $formattedAmount = $order->getBaseCurrency()->formatTxt($amount); if ($payment->getIsTransactionPending()) { $state = Order::STATE_PAYMENT_REVIEW; $message = __('We will authorize %1 after the payment is approved at the payment gateway.', $formattedAmount); } else { if ($payment->getIsFraudDetected()) { $state = Order::STATE_PROCESSING; $message = __('Order is suspended as its authorizing amount %1 is suspected to be fraudulent.', $formattedAmount); } else { $message = __('Authorized amount of %1', $formattedAmount); } } if ($payment->getIsFraudDetected()) { $status = Order::STATUS_FRAUD; } $this->setOrderStateAndStatus($order, $status, $state); return $message; }
/** * Run command * * @param OrderPaymentInterface $payment * @param string|float|int $amount * @param OrderInterface $order * @return string */ public function execute(OrderPaymentInterface $payment, $amount, OrderInterface $order) { /** * @var $payment Payment */ $state = Order::STATE_PROCESSING; $status = false; $formattedAmount = $order->getBaseCurrency()->formatTxt($amount); if ($payment->getIsTransactionPending()) { $message = __('An amount of %1 will be captured after being approved at the payment gateway.', $formattedAmount); $state = Order::STATE_PAYMENT_REVIEW; } else { $message = __('Registered notification about captured amount of %1.', $formattedAmount); } if ($payment->getIsFraudDetected()) { $state = Order::STATE_PAYMENT_REVIEW; $message = __('Order is suspended as its capture amount %1 is suspected to be fraudulent.', $formattedAmount); $status = Order::STATUS_FRAUD; } $this->setOrderStateAndStatus($order, $status, $state); return $message; }
/** * Update transaction ids for further processing * If no transactions were set before invoking, may generate an "offline" transaction id * * @param OrderPaymentInterface $payment * @param string $type * @param bool|Transaction $transactionBasedOn * @return string|null */ public function generateTransactionId(OrderPaymentInterface $payment, $type, $transactionBasedOn = false) { if (!$payment->getParentTransactionId() && !$payment->getTransactionId() && $transactionBasedOn) { $payment->setParentTransactionId($transactionBasedOn->getTxnId()); } // generate transaction id for an offline action or payment method that didn't set it if (($parentTxnId = $payment->getParentTransactionId()) && !$payment->getTransactionId()) { return "{$parentTxnId}-{$type}"; } return $payment->getTransactionId(); }
/** * Links transaction with parent transaction * * @param TransactionInterface $transaction * @return TransactionInterface */ protected function linkWithParentTransaction(TransactionInterface $transaction) { $parentTransactionId = $this->payment->getParentTransactionId(); if ($parentTransactionId) { $transaction->setParentTxnId($parentTransactionId); if ($this->payment->getShouldCloseParentTransaction()) { $parentTransaction = $this->transactionRepository->getByTransactionId($parentTransactionId, $this->payment->getid(), $this->order->getId()); if ($parentTransaction) { if (!$parentTransaction->getIsClosed()) { $parentTransaction->isFailsafe($this->failSafe)->close(false); } $this->order->addRelatedObject($parentTransaction); } } } return $transaction; }
/** * @param \Magento\Sales\Api\Data\OrderPaymentInterface $payment * @return Payment */ public function setPayment(\Magento\Sales\Api\Data\OrderPaymentInterface $payment) { if (!$this->getIsMultiPayment() && ($previousPayment = $this->getPayment())) { $payment->setEntityId($previousPayment->getEntityId()); } $this->addPayment($payment); return $payment; }
/** * Get transaction with type order * * @param OrderPaymentInterface $payment * * @return false|\Magento\Sales\Api\Data\TransactionInterface */ protected function getOrderTransaction($payment) { return $this->transactionRepository->getByTransactionType(Transaction::TYPE_ORDER, $payment->getId(), $payment->getOrder()->getId()); }
/** * Check if capture transaction already exists * * @param OrderPaymentInterface $payment * @return bool */ private function isExistsCaptureTransaction(OrderPaymentInterface $payment) { $filters[] = $this->filterBuilder->setField('payment_id')->setValue($payment->getId())->create(); $filters[] = $this->filterBuilder->setField('txn_type')->setValue(TransactionInterface::TYPE_CAPTURE)->create(); $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)->create(); $count = $this->transactionRepository->getList($searchCriteria)->getTotalCount(); return (bool) $count; }
/** * Check if payment was used vault token * * @param OrderPaymentInterface $payment * @return bool */ private function isExistsVaultToken(OrderPaymentInterface $payment) { $extensionAttributes = $payment->getExtensionAttributes(); return (bool) $extensionAttributes->getVaultPaymentToken(); }
/** * {@inheritdoc} */ public function setPayment(\Magento\Sales\Api\Data\OrderPaymentInterface $payment = null) { $payment->setOrder($this)->setParentId($this->getId()); if (!$payment->getId()) { $this->setData(OrderInterface::PAYMENT, $payment); $this->setDataChanges(true); } return $payment; }
/** * @return string */ public function getMethodTitle() { return $this->orderPayment->getMethodInstance()->getTitle(); }
/** * Get vault payment token entity * * @param \Braintree\Transaction $transaction * @param OrderPaymentInterface $payment * @return PaymentTokenInterface|null */ protected function getVaultPaymentToken(Transaction $transaction, OrderPaymentInterface $payment) { // Check token existing in gateway response $token = $transaction->creditCardDetails->token; if (empty($token)) { return null; } $order = $payment->getOrder(); /** @var PaymentTokenInterface $paymentToken */ $paymentToken = $this->paymentTokenFactory->create(); $paymentToken->setGatewayToken($token); $paymentToken->setCustomerId($order->getCustomerId()); $paymentToken->setPaymentMethodCode($payment->getMethod()); $paymentToken->setCreatedAt($order->getCreatedAt()); $paymentToken->setTokenDetails($this->convertDetailsToJSON(['type' => $this->getCreditCardType($transaction->creditCardDetails->cardType), 'maskedCC' => $transaction->creditCardDetails->last4, 'expirationDate' => $transaction->creditCardDetails->expirationDate])); return $paymentToken; }
/** * @param PaymentTokenInterface $token * @param OrderPaymentInterface $payment * @return bool */ public function saveTokenWithPaymentLink(PaymentTokenInterface $token, OrderPaymentInterface $payment) { $tokenDuplicate = $this->getByPublicHash($token->getPublicHash(), $token->getCustomerId()); if (!empty($tokenDuplicate)) { if ($token->getIsVisible() || $tokenDuplicate->getIsVisible()) { $token->setEntityId($tokenDuplicate->getEntityId()); $token->setIsVisible(true); } elseif ($token->getIsVisible() === $tokenDuplicate->getIsVisible()) { $token->setEntityId($tokenDuplicate->getEntityId()); } else { $token->setPublicHash($this->encryptor->getHash($token->getPublicHash() . $token->getGatewayToken())); } } $this->paymentTokenRepository->save($token); $result = $this->addLinkToOrderPayment($token->getEntityId(), $payment->getEntityId()); return $result; }
/** * @param PaymentTokenInterface $token * @param OrderPaymentInterface $payment * @return bool */ public function saveTokenWithPaymentLink(PaymentTokenInterface $token, OrderPaymentInterface $payment) { $tokenDuplicate = $this->getByPublicHash($token->getPublicHash(), $token->getCustomerId()); if (!empty($tokenDuplicate)) { $token->setEntityId($tokenDuplicate->getEntityId()); $token->setIsVisible($token->getIsActive()); } $this->paymentTokenRepository->save($token); $result = $this->addLinkToOrderPayment($token->getEntityId(), $payment->getEntityId()); return $result; }
/** * @param OrderPaymentInterface $payment * @return \Magento\Sales\Api\Data\OrderPaymentExtensionInterface */ private function getPaymentExtensionAttributes(OrderPaymentInterface $payment) { $extensionAttributes = $payment->getExtensionAttributes(); if ($extensionAttributes === null) { $extensionAttributes = $this->paymentExtensionFactory->create(); $payment->setExtensionAttributes($extensionAttributes); } return $extensionAttributes; }