/** * Find open transaction in customer's profile * * @param \XLite\Model\Payment\Transaction $parentTransaction Parent transaction * * @return \XLite\Model\Payment\Transaction */ protected function findOpenProfileTransaction(\XLite\Model\Payment\Transaction $parentTransaction) { $openTransaction = null; $login = $parentTransaction->getOrder()->getProfile()->getLogin(); $cnd = new \XLite\Core\CommonCell(); $class = 'XLite\\Module\\CDev\\XPaymentsConnector\\Model\\Payment\\XpcTransactionData'; $cnd->{\XLite\Module\CDev\XPaymentsConnector\Model\Repo\Payment\XpcTransactionData::SEARCH_LOGIN} = $login; $profileTransactions = \XLite\Core\Database::getRepo($class)->search($cnd); foreach ($profileTransactions as $transactionData) { $transaction = $transactionData->getTransaction(); if ($this->isSavedCardTransaction($transaction) && ($transaction->isPending() || $transaction->isInProgress())) { $openTransaction = $transaction; break; } } return $openTransaction; }
/** * Save init payment form data to session * * @param \XLite\Model\Payment\Transaction $transaction Transaction OPTIONAL * @param array $data Form data OPTIONAL * * @return void */ public function saveInitDataToSession(\XLite\Model\Payment\Transaction $transaction = null, $data = null) { if ($transaction && $this->isInitDataValid($data)) { $formData = \XLite\Core\Session::getInstance()->xpc_form_data; if (!is_array($formData)) { $formData = array(); } $data['savedCart'] = $this->prepareCart($transaction->getOrder(), $transaction->getPaymentMethod()); $formData[$transaction->getPaymentMethod()->getMethodId()] = $data; } else { $formData = null; } \XLite\Core\Session::getInstance()->xpc_form_data = $formData; }
/** * {@inheritDoc} */ public function getOrder() { $this->__initializer__ && $this->__initializer__->__invoke($this, 'getOrder', array()); return parent::getOrder(); }
/** * Get current transaction order profile * * @return \XLite\Model\Profile */ protected function getProfile() { return $this->transaction->getOrder()->getProfile(); }
/** * Convert order to array for DoExpressCheckoutPayment * * @param \XLite\Model\Payment\Transaction $transaction Transaction * @param string $token Token * @param string $payerId Payer id * * @return array * @see https://developer.paypal.com/docs/classic/api/merchant/DoExpressCheckoutPayment_API_Operation_NVP/ */ public function convertDoExpressCheckoutPaymentParams($transaction, $token, $payerId) { /** @var \XLite\Model\Order $order */ $order = $transaction->getOrder(); /** @var \XLite\Model\Currency $currency */ $currency = $order->getCurrency(); $orderTotal = $currency->roundValue($transaction->getValue()); $shippingCost = $this->getShippingCost($order); /** @var \XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckoutMerchantAPI $processor */ $processor = $this->getProcessor(); $params = array('TOKEN' => $token, 'PAYERID' => $payerId, 'PAYMENTREQUEST_0_AMT' => $orderTotal, 'PAYMENTREQUEST_0_PAYMENTACTION' => $this->getPaymentAction(), 'PAYMENTREQUEST_0_CURRENCYCODE' => $currency->getCode(), 'PAYMENTREQUEST_0_HANDLINGAMT' => 0, 'PAYMENTREQUEST_0_INSURANCEAMT' => 0, 'PAYMENTREQUEST_0_SHIPPINGAMT' => (double) $shippingCost, 'PAYMENTREQUEST_0_NOTIFYURL' => $processor->getPaymentCallbackUrl()); $items = $this->getItems($order); // To avoid total mismatch clear tax and shipping cost $taxAmt = isset($items['PAYMENTREQUEST_0_TAXAMT']) ? $items['PAYMENTREQUEST_0_TAXAMT'] : 0; if (abs($orderTotal - $items['PAYMENTREQUEST_0_ITEMAMT'] - $taxAmt - $shippingCost) > 1.0E-10) { $correction = $orderTotal - $items['PAYMENTREQUEST_0_ITEMAMT'] - $taxAmt - $shippingCost; $correction = round($correction, 2); $index = $order->countItems() + 1; $items['L_PAYMENTREQUEST_0_AMT' . $index] = $correction; $items['L_PAYMENTREQUEST_0_NAME' . $index] = 'Correction'; $items['L_PAYMENTREQUEST_0_QTI' . $index] = 1; $items['PAYMENTREQUEST_0_ITEMAMT'] += $correction; } $params += $items; return $params; }
/** * Get order * * @param \XLite\Model\Payment\Transaction $entity Payment transaction * * @return string */ protected function getOrderColumnValue(\XLite\Model\Payment\Transaction $entity) { /** @var \XLite\Model\Order $order */ $order = $entity->getOrder(); return $order instanceof \XLite\Model\Cart ? null : $order->getOrderNumber(); }
/** * Convert order to array for DoExpressCheckoutPayment * * @param \XLite\Model\Payment\Transaction $transaction Transaction * @param string $token Token * @param string $payerId Payer id * * @return array * @see https://www.paypalobjects.com/webstatic/en_US/developer/docs/pdf/pfp_expresscheckout_pp.pdf */ public function convertDoExpressCheckoutPaymentParams($transaction, $token, $payerId) { /** @var \XLite\Model\Order $order */ $order = $transaction->getOrder(); /** @var \XLite\Model\Currency $currency */ $currency = $order->getCurrency(); $orderTotal = $currency->roundValue($transaction->getValue()); $shippingCost = $this->getShippingCost($order); /** @var \XLite\Module\CDev\Paypal\Model\Payment\Processor\ExpressCheckoutMerchantAPI $processor */ $processor = $this->getProcessor(); $params = array('TRXTYPE' => $this->getPaymentAction(), 'TENDER' => 'P', 'ACTION' => 'D', 'TOKEN' => $token, 'PAYERID' => $payerId, 'AMT' => $orderTotal, 'CURRENCY' => $currency->getCode(), 'FREIGHTAMT' => (double) $shippingCost, 'HANDLINGAMT' => 0, 'INSURANCEAMT' => 0, 'NOTIFYURL' => $processor->getPaymentCallbackUrl(), 'ALLOWNOTE' => 1); $items = $this->getItems($order); // To avoid total mismatch clear tax and shipping cost $taxAmt = isset($items['TAXAMT']) ? $items['TAXAMT'] : 0; if (abs($orderTotal - $items['ITEMAMT'] - $taxAmt - $shippingCost) > 1.0E-10) { $items['ITEMAMT'] = $orderTotal; $items['TAXAMT'] = 0; $params['FREIGHTAMT'] = 0; } $params += $items; return $params; }
/** * Return order entity for given transaction * * @param \XLite\Model\Payment\Transaction $entity Transaction entity * * @return \XLite\Model\Order */ protected function getOrder($entity) { return $entity->getOrder(); }