/**
  * Capture payment
  *
  * @param Mage_Sales_Model_Order_Payment $payment
  * @param float $amount
  * @return Mage_Paypal_Model_Express
  */
 public function capture(Varien_Object $payment, $amount)
 {
     $authorizationTransaction = $payment->getAuthorizationTransaction();
     $authorizationPeriod = abs(intval($this->getConfigData('authorization_honor_period')));
     $maxAuthorizationNumber = abs(intval($this->getConfigData('child_authorization_number')));
     $order = $payment->getOrder();
     $isAuthorizationCreated = false;
     if ($payment->getAdditionalInformation($this->_isOrderPaymentActionKey)) {
         $voided = false;
         if (!$authorizationTransaction->getIsClosed() && $this->_isTransactionExpired($authorizationTransaction, $authorizationPeriod)) {
             //Save payment state and configure payment object for voiding
             $isCaptureFinal = $payment->getShouldCloseParentTransaction();
             $captureTrxId = $payment->getTransactionId();
             $payment->setShouldCloseParentTransaction(false);
             $payment->setParentTransactionId($authorizationTransaction->getTxnId());
             $payment->unsTransactionId();
             $payment->setVoidOnlyAuthorization(true);
             $payment->void(new Varien_Object());
             //Revert payment state after voiding
             $payment->unsAuthorizationTransaction();
             $payment->unsTransactionId();
             $payment->setShouldCloseParentTransaction($isCaptureFinal);
             $voided = true;
         }
         if ($authorizationTransaction->getIsClosed() || $voided) {
             if ($payment->getAdditionalInformation($this->_authorizationCountKey) > $maxAuthorizationNumber - 1) {
                 Mage::throwException(Mage::helper('paypal')->__('The maximum number of child authorizations is reached.'));
             }
             $api = $this->_callDoAuthorize($amount, $payment, $authorizationTransaction->getParentTxnId());
             //Adding authorization transaction
             $this->_pro->importPaymentInfo($api, $payment);
             $payment->setTransactionId($api->getTransactionId());
             $payment->setParentTransactionId($authorizationTransaction->getParentTxnId());
             $payment->setIsTransactionClosed(false);
             $formatedPrice = $order->getBaseCurrency()->formatTxt($amount);
             if ($payment->getIsTransactionPending()) {
                 $message = Mage::helper('paypal')->__('Authorizing amount of %s is pending approval on gateway.', $formatedPrice);
             } else {
                 $message = Mage::helper('paypal')->__('Authorized amount of %s.', $formatedPrice);
             }
             $transaction = $payment->addTransaction(Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH, null, true, $message);
             $payment->setParentTransactionId($api->getTransactionId());
             $isAuthorizationCreated = true;
         }
         //close order transaction if needed
         if ($payment->getShouldCloseParentTransaction()) {
             $orderTransaction = $payment->lookupTransaction(false, Mage_Sales_Model_Order_Payment_Transaction::TYPE_ORDER);
             if ($orderTransaction) {
                 $orderTransaction->setIsClosed(true);
                 $order->addRelatedObject($orderTransaction);
             }
         }
     }
     if (false === $this->_pro->capture($payment, $amount)) {
         $this->_placeOrder($payment, $amount);
     }
     if ($isAuthorizationCreated && isset($transaction)) {
         $transaction->setIsClosed(true);
     }
     return $this;
 }
 /**
  * Authorize and Capture
  *
  * @param Varien_Object $payment
  * @param float $amount
  *
  * @return Amazon_Payments_Model_PaymentMethod
  */
 public function capture(Varien_Object $payment, $amount)
 {
     $transactionAuth = $payment->lookupTransaction(false, Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH);
     $authReferenceId = $transactionAuth->getTxnId();
     $order = $payment->getOrder();
     $result = $this->_getApi($order->getStoreId())->capture($authReferenceId, $authReferenceId, $amount, $order->getBaseCurrencyCode(), $this->_getSoftDescriptor());
     if ($result) {
         $status = $result->getCaptureStatus();
         // Error handling
         switch ($status->getState()) {
             case Amazon_Payments_Model_Api::AUTH_STATUS_PENDING:
                 Mage::getSingleton('adminhtml/session')->addError('The invoice you are trying to create is for an authorization that is more than 7 days old. A capture request has been made. Please try and create this invoice again in 1 hour, allowing time for the capture to process.');
                 // cont'd...
             // cont'd...
             case Amazon_Payments_Model_Api::AUTH_STATUS_DECLINED:
             case Amazon_Payments_Model_Api::AUTH_STATUS_CLOSED:
                 $this->_setErrorCheck();
                 Mage::throwException('Amazon Payments capture error: ' . $status->getReasonCode() . ' - ' . $status->getReasonDescription());
                 break;
             case Amazon_Payments_Model_Api::AUTH_STATUS_COMPLETED:
                 // Already captured.
                 break;
             default:
                 $this->_setErrorCheck();
                 Mage::throwException('Amazon Payments capture error.');
                 break;
         }
         $payment->setTransactionId($result->getAmazonCaptureId());
         $payment->setParentTransactionId($authReferenceId);
         $payment->setIsTransactionClosed(false);
     } else {
         $this->_setErrorCheck();
         Mage::throwException('Unable to capture payment at this time. Please try again later.');
     }
     return $this;
 }
Example #3
0
 /**
  * Capture an authorized payment. This should only be available if there
  * is an open authorized transaction already.
  *
  * @param Varien_Object $payment
  * @param int|float $amount
  */
 public function capture(Varien_Object $payment, $amount)
 {
     $order = $payment->getOrder();
     $transactionId = $payment->getParentTransactionId();
     if (empty($transactionId)) {
         // @see Made_Dibs_Model_Observer ~ line 58
         $transactionId = $payment->getAuthorizeTransactionId();
         $payment->setParentTransactionId($transactionId);
     }
     $parameters = array('transactionId' => $transactionId, 'amount' => $this->formatAmount($amount, $order->getOrderCurrencyCode()), 'doReAuthIfExpired' => (bool) $this->getConfigData('reauth_expired') ? 'true' : 'false');
     $result = $this->_apiCall('CaptureTransaction', $parameters);
     $transactionString = $transactionId . '-capture-' . $this->formatAmount($order->getBaseTotalDue(), $order->getOrderCurrencyCode());
     $payment->setTransactionId($transactionString)->setIsTransactionClosed(true)->setTransactionAdditionalInfo(Mage_Sales_Model_Order_Payment_Transaction::RAW_DETAILS, array_merge($result, $parameters));
     return $this;
 }
 /**
  * Additional authorization logic for Account Verification
  *
  * @param Varien_Object $payment
  * @param mixed $amount
  * @param Mage_Paypal_Model_Payment_Transaction $transaction
  * @param string $txnId
  * @return Mage_Paypal_Model_Payflowlink
  */
 protected function _authorize(Varien_Object $payment, $amount, $transaction, $txnId)
 {
     $authorizationAmount = $payment->getAdditionalInformation('authorization_amount');
     if ($authorizationAmount == Mage_Paypal_Model_Config::AUTHORIZATION_AMOUNT_ONE) {
         $payment->setParentTransactionId($txnId);
         $this->void($payment);
     } elseif ($authorizationAmount == Mage_Paypal_Model_Config::AUTHORIZATION_AMOUNT_FULL) {
         $this->_checkTransaction($transaction, $amount);
     }
     return $this;
 }
 /**
  * Authorize payment method
  *
  * @param Varien_Object $payment
  * @param float $amount
  *
  * @throws Exception Payment could not be executed
  *
  * @return Iways_PayPalPlus_Model_Payment
  */
 public function authorize(Varien_Object $payment, $amount)
 {
     $paymentId = Mage::app()->getRequest()->getParam('paymentId');
     $payerId = Mage::app()->getRequest()->getParam('PayerID');
     try {
         if (Mage::getStoreConfig('payment/iways_paypalplus_payment/transfer_reserved_order_id')) {
             Mage::getModel('iways_paypalplus/api')->patchInvoiceNumber($paymentId, $payment->getOrder()->getIncrementId());
         }
     } catch (\Exception $e) {
         Mage::logException($e);
     }
     /**
      * @var \PayPal\Api\Payment $ppPayment
      */
     $ppPayment = Mage::getModel('iways_paypalplus/api')->executePayment($paymentId, $payerId);
     Mage::getSingleton('customer/session')->setPayPalPaymentId(null);
     Mage::getSingleton('customer/session')->setPayPalPaymentPatched(null);
     if (!$ppPayment) {
         Mage::throwException('Payment could not be executed.');
     }
     if ($paymentInstructions = $ppPayment->getPaymentInstruction()) {
         $payment->setData('ppp_pui_reference_number', $paymentInstructions->getReferenceNumber());
         $payment->setData('ppp_pui_instruction_type', $paymentInstructions->getInstructionType());
         $payment->setData('ppp_pui_payment_due_date', Mage::helper('iways_paypalplus')->convertDueDate($paymentInstructions->getPaymentDueDate()));
         $payment->setData('ppp_pui_note', $paymentInstructions->getNote());
         $bankInsctructions = $paymentInstructions->getRecipientBankingInstruction();
         $payment->setData('ppp_pui_bank_name', $bankInsctructions->getBankName());
         $payment->setData('ppp_pui_account_holder_name', $bankInsctructions->getAccountHolderName());
         $payment->setData('ppp_pui_international_bank_account_number', $bankInsctructions->getInternationalBankAccountNumber());
         $payment->setData('ppp_pui_bank_identifier_code', $bankInsctructions->getBankIdentifierCode());
         $payment->setData('ppp_pui_routing_number', $bankInsctructions->getRoutingNumber());
         $ppAmount = $paymentInstructions->getAmount();
         $payment->setData('ppp_pui_amount', $ppAmount->getValue());
         $payment->setData('ppp_pui_currency', $ppAmount->getCurrency());
     }
     $transactionId = null;
     try {
         $transactions = $ppPayment->getTransactions();
         if ($transactions && isset($transactions[0])) {
             $resource = $transactions[0]->getRelatedResources();
             if ($resource && isset($resource[0])) {
                 $sale = $resource[0]->getSale();
                 $transactionId = $sale->getId();
                 if ($sale->getState() == self::PENDING) {
                     $payment->setIsTransactionPending(true);
                 }
             }
         }
     } catch (Exception $e) {
         $transactionId = $ppPayment->getId();
     }
     $payment->setTransactionId($transactionId);
     $payment->setParentTransactionId($ppPayment->getId());
     if ($ppPayment->getState() == self::PPP_STATUS_APPROVED) {
         $payment->setStatus(self::STATUS_APPROVED);
     }
     return $this;
 }