/** * * @param Mage_Customer_Model_Customer $customer * @param Allopass_Hipay_Model_Api_Response_Gateway $response * @param boolean $isRecurring */ public function responseToCustomer($customer, $response, $isRecurring = false) { $paymentMethod = $response->getPaymentMethod(); $paymentProduct = $response->getPaymentProduct(); $token = isset($paymentMethod['token']) ? $paymentMethod['token'] : $response->getData('cardtoken'); if ($isRecurring) { $customer->setHipayAliasRecurring($token); } else { $customer->setHipayAliasOneclick($token); } if (isset($paymentMethod['card_expiry_month']) && $paymentMethod['card_expiry_year']) { $customer->setHipayCcExpDate($paymentMethod['card_expiry_month'] . "-" . $paymentMethod['card_expiry_year']); } else { $customer->setHipayCcExpDate(substr($response->getData('cardexpiry'), 4, 2) . "-" . substr($response->getData('cardexpiry'), 0, 4)); } $customer->setHipayCcNumberEnc(isset($paymentMethod['pan']) ? $paymentMethod['pan'] : $response->getData('cardpan')); //$customer->setHipayCcType(isset($paymentMethod['brand']) ? strtolower($paymentMethod['brand']) : strtolower($response->getData('cardbrand'))); $customer->setHipayCcType($paymentProduct); $customer->getResource()->saveAttribute($customer, 'hipay_alias_oneclick'); $customer->getResource()->saveAttribute($customer, 'hipay_cc_exp_date'); $customer->getResource()->saveAttribute($customer, 'hipay_cc_number_enc'); $customer->getResource()->saveAttribute($customer, 'hipay_cc_type'); return $this; }
/** * * @param Allopass_Hipay_Model_Api_Response_Gateway $gatewayResponse * @param Mage_Sales_Model_Order_Payment $payment * @param float $amount */ public function processResponse($gatewayResponse, $payment, $amount) { $order = $payment->getOrder(); $customer = Mage::getModel('customer/customer')->load($order->getCustomerId()); //$defaultExceptionMessage = Mage::helper('hipay')->__('Error in process response!'); switch ($this->getConfigPaymentAction()) { case Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE: $requestType = self::OPERATION_AUTHORIZATION; $newTransactionType = Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH; $defaultExceptionMessage = Mage::helper('hipay')->__('Payment authorization error.'); break; case Mage_Payment_Model_Method_Abstract::ACTION_AUTHORIZE_CAPTURE: $requestType = self::OPERATION_SALE; $newTransactionType = Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE; $defaultExceptionMessage = Mage::helper('hipay')->__('Payment capturing error.'); break; } //add data to payment object if ($payment->getCcType() == "") { $payment->setCcType($gatewayResponse->getPaymentProduct()); } switch ($gatewayResponse->getState()) { case self::STATE_COMPLETED: case self::STATE_PENDING: switch ((int) $gatewayResponse->getStatus()) { case 111: //denied $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), $newTransactionType, array('is_transaction_closed' => 0), array(), Mage::helper('hipay')->getTransactionMessage($payment, $requestType, null, $amount)); if ($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED) { $order->unhold(); } if (!($status = $this->getConfigData('order_status_payment_refused'))) { $status = $order->getStatus(); } if ($status == Mage_Sales_Model_Order::STATE_HOLDED && $order->canHold()) { $order->hold(); } elseif ($status == Mage_Sales_Model_Order::STATE_CANCELED && $order->canCancel()) { $order->cancel(); } $order->addStatusToHistory($status, Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, null, $amount, true, $gatewayResponse->getMessage())); $order->save(); break; case 112: //Authorized and pending $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH, array('is_transaction_closed' => 0), array($this->_realTransactionIdKey => $gatewayResponse->getTransactionReference()), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, $gatewayResponse->getTransactionReference(), $amount, true)); $state = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT; $status = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT; if (defined('Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW')) { $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; $status = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; } $this->_setFraudDetected($gatewayResponse, $customer, $payment, $amount); $order->setState($state, $status, $gatewayResponse->getMessage()); $payment->setAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $payment->setBaseAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $order->save(); break; case 142: //Authorized Requested if ($order->getStatus() == self::STATUS_CAPTURE_REQUESTED || $order->getStatus() == Mage_Sales_Model_Order::STATE_PROCESSING || $order->getStatus() == Mage_Sales_Model_Order::STATE_COMPLETE || $order->getStatus() == Mage_Sales_Model_Order::STATE_CLOSED || $order->getStatus() == self::STATUS_PENDING_CAPTURE) { // for logic process break; } $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH, array('is_transaction_closed' => 0), array($this->_realTransactionIdKey => $gatewayResponse->getTransactionReference()), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, $gatewayResponse->getTransactionReference(), $amount, true)); $state = Mage_Sales_Model_Order::STATE_PENDING_PAYMENT; if (defined('Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW')) { $state = Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW; } $status = self::STATUS_AUTHORIZATION_REQUESTED; $order->setState($state, $status, $gatewayResponse->getMessage()); $payment->setAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $payment->setBaseAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $order->save(); break; case 114: //Expired if ($order->getStatus() != self::STATUS_PENDING_CAPTURE) { // for logic process break; } $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_VOID, array('is_transaction_closed' => 0), array($this->_realTransactionIdKey => $gatewayResponse->getTransactionReference()), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, $gatewayResponse->getTransactionReference(), $amount, true)); /** * We change status to expired and state to holded * So the administrator can try to capture transaction even if * the auhorization was expired * */ $state = Mage_Sales_Model_Order::STATE_HOLDED; $status = self::STATUS_EXPIRED; $order->setState($state, $status, $gatewayResponse->getMessage()); $order->save(); break; case 115: //Canceled if ($order->cancel()) { $order->cancel(); $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_VOID, array('is_transaction_closed' => 1), array($this->_realTransactionIdKey => $gatewayResponse->getTransactionReference()), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, $gatewayResponse->getTransactionReference(), $amount, true)); } break; case 116: //Authorized //check if this order was in state fraud detected $fraud_type = $order->getPayment()->getAdditionalInformation('fraud_type'); $fraud_score = $order->getPayment()->getAdditionalInformation('scoring'); $has_fraud = !empty($fraud_type) && !empty($fraud_score); if ($order->getStatus() == 'capture_requested' || $order->getStatus() == 'processing' && !$has_fraud || $order->getStatus() == 'complete' || $order->getStatus() == 'closed') { // for logic process break; } if (!$this->isPreauthorizeCapture($payment)) { $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_AUTH, array('is_transaction_closed' => 0), array(), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_AUTHORIZATION, null, $amount)); } $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, self::STATUS_PENDING_CAPTURE, Mage::helper('hipay')->__("Waiting for capture transaction ID '%s' of amount %s", $gatewayResponse->getTransactionReference(), $order->getBaseCurrency()->formatTxt($order->getBaseTotalDue())), $notified = true); $order->save(); // Send order confirmation email - TPPMAG1-29 if (!$order->getEmailSent() && $order->getCanSendNewEmailFlag()) { try { if (method_exists($order, 'queueNewOrderEmail')) { $order->queueNewOrderEmail(); } else { $order->sendNewOrderEmail(); } } catch (Exception $e) { Mage::logException($e); } } $payment->setAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $payment->setBaseAmountAuthorized($gatewayResponse->getAuthorizedAmount()); break; case 117: //Capture Requested if ($order->getStatus() == 'capture' || $order->getStatus() == 'processing') { // for logic process break; } $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), Mage_Sales_Model_Order_Payment_Transaction::TYPE_CAPTURE, array('is_transaction_closed' => 0), array(), Mage::helper('hipay')->getTransactionMessage($payment, self::OPERATION_SALE, null, $amount)); $message = Mage::helper("hipay")->__('Capture Requested by Hipay.'); $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, 'capture_requested', $message, null, false); $payment->setAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $payment->setBaseAmountAuthorized($gatewayResponse->getAuthorizedAmount()); //If status Capture Requested is not configured to validate the order, we break. if (((int) $this->getConfigData('hipay_status_validate_order') == 117) === false) { break; } case 118: //Capture. There are 2 ways to enter in this case: 1. direct capture notification. 2. After 117 case, when it is configured for valid order with 117 status. if ($order->getStatus() == $this->getConfigData('order_status_payment_accepted')) { break; } //If status Capture Requested is configured to validate the order and is a direct capture notification (118), we break because order is already validate. if (((int) $this->getConfigData('hipay_status_validate_order') == 117) === true && (int) $gatewayResponse->getStatus() == 118) { // if callback 118 and config validate order = 117 and no 117 in history - execute treatment alse break $histories = Mage::getResourceModel('sales/order_status_history_collection')->setOrderFilter($order)->addFieldToFilter('comment', array('like' => '%code-117%')); if ($histories->count() > 0) { break; } } //Check if it is split payment and insert it $profile = 0; if (($profile = (int) $payment->getAdditionalInformation('split_payment_id')) && $customer->getId()) { $token = isset($gatewayResponse->paymentMethod['token']) ? $gatewayResponse->paymentMethod['token'] : $gatewayResponse->getData('cardtoken'); $this->getHelper()->insertSplitPayment($order, $profile, $customer->getId(), $token); } if ($amount != $order->getBaseGrandTotal() && !$profile && $order->getState() != Mage_Sales_Model_Order::STATE_PAYMENT_REVIEW) { $transactionId = $gatewayResponse->getTransactionReference(); $order->addStatusHistoryComment(Mage::helper('hipay')->__('Notification "Capture". Capture issued by merchant. Registered notification about captured amount of %s. Transaction ID: "%s". Invoice has not been created. Please create offline Invoice.', $order->getBaseCurrency()->formatTxt($amount), $transactionId), false); break; } if ($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED) { $order->unhold(); } // Create invoice if ($this->getConfigData('invoice_create', $order->getStoreId()) && !$order->hasInvoices()) { $invoice = $this->create_invoice($order, $gatewayResponse->getTransactionReference(), false); Mage::getModel('core/resource_transaction')->addObject($invoice)->addObject($invoice->getOrder())->save(); } elseif ($order->hasInvoices()) { foreach ($order->getInvoiceCollection() as $invoice) { if ($invoice->getState() == Mage_Sales_Model_Order_Invoice::STATE_OPEN && round($invoice->getBaseGrandTotal() + $order->getBaseTotalPaid(), 2) == $gatewayResponse->getCapturedAmount()) { $invoice->pay(); Mage::getModel('core/resource_transaction')->addObject($invoice)->addObject($invoice->getOrder())->save(); } } } if (($profile = (int) $payment->getAdditionalInformation('split_payment_id')) && $customer->getId()) { $token = isset($gatewayResponse->paymentMethod['token']) ? $gatewayResponse->paymentMethod['token'] : $gatewayResponse->getData('cardtoken'); $this->getHelper()->insertSplitPayment($order, $profile, $customer->getId(), $token); } if (!($status = $this->getConfigData('order_status_payment_accepted'))) { $status = $order->getStatus(); } $message = Mage::helper("hipay")->__('Payment accepted by Hipay.'); if ($status == Mage_Sales_Model_Order::STATE_PROCESSING) { $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, $status, $message); } else { if ($status == Mage_Sales_Model_Order::STATE_COMPLETE) { $order->setData('state', Mage_Sales_Model_Order::STATE_COMPLETE); $order->addStatusToHistory($status, $message, true); /*$order->setState( Mage_Sales_Model_Order::STATE_COMPLETE, $status, $message, null, false );*/ } else { $order->addStatusToHistory($status, $message, true); } } $payment->setAmountAuthorized($gatewayResponse->getAuthorizedAmount()); $payment->setBaseAmountAuthorized($gatewayResponse->getAuthorizedAmount()); // Send order confirmation email - TPPMAG1-29 if (!$order->getEmailSent() && $order->getCanSendNewEmailFlag()) { try { if (method_exists($order, 'queueNewOrderEmail')) { $order->queueNewOrderEmail(); } else { $order->sendNewOrderEmail(); } } catch (Exception $e) { Mage::logException($e); } } break; case 124: //Refund Requested $message = Mage::helper("hipay")->__('Refund Requested by Hipay.'); $order->setState(Mage_Sales_Model_Order::STATE_PROCESSING, 'refund_requested', $message, null, false); break; case 125: //Refund //Refund case 126: //Partially Refund if ($order->hasCreditmemos()) { $total_already_refunded = 0; /* @var $creditmemo Mage_Sales_Model_Order_Creditmemo */ //We get total already refunded for found the amount of this creditmemo foreach ($order->getCreditmemosCollection() as $creditmemo) { if ($creditmemo->getState() == Mage_Sales_Model_Order_Creditmemo::STATE_REFUNDED) { $total_already_refunded += $creditmemo->getGrandTotal(); } } $cm_amount_check = round($gatewayResponse->getRefundedAmount() - $total_already_refunded, 2); $status = $order->getStatus(); if (round($gatewayResponse->getRefundedAmount(), 2) < round($order->getGrandTotal(), 2)) { $status = self::STATUS_PARTIAL_REFUND; } /* @var $creditmemo Mage_Sales_Model_Order_Creditmemo */ foreach ($order->getCreditmemosCollection() as $creditmemo) { if ($creditmemo->getState() == Mage_Sales_Model_Order_Creditmemo::STATE_OPEN && round($creditmemo->getGrandTotal(), 2) == $cm_amount_check) { $creditmemo->setState(Mage_Sales_Model_Order_Creditmemo::STATE_REFUNDED); $message = Mage::helper("hipay")->__('Refund accepted by Hipay.'); $order->addStatusToHistory($status, $message); Mage::getModel('core/resource_transaction')->addObject($creditmemo)->addObject($creditmemo->getOrder())->save(); break; } } } elseif ($order->canCreditmemo()) { if ($amount != $order->getBaseGrandTotal()) { $transactionId = $gatewayResponse->getTransactionReference(); $order->addStatusHistoryComment(Mage::helper('hipay')->__('Notification "Refunded". Refund issued by merchant. Registered notification about refunded amount of %s. Transaction ID: "%s". Credit Memo has not been created. Please create offline Credit Memo.', $order->getBaseCurrency()->formatTxt($amount), $transactionId), false); return $this; } $amountTxt = $order->getBaseCurrency()->formatTxt($amount); $transactionId = $gatewayResponse->getTransactionReference(); $comment = Mage::helper('hipay')->__('Refunded amount of %s. Transaction ID: "%s"', $amountTxt, $transactionId); $isRefundFinal = $gatewayResponse->getRefundedAmount() == $order->getGrandTotal(); $payment->setIsTransactionClosed($isRefundFinal)->registerRefundNotification($amount); $order->addStatusHistoryComment($comment, false); // TODO: there is no way to close a capture right now $creditmemo = $payment->getCreatedCreditmemo(); if ($creditmemo) { $creditmemo->sendEmail(); $order->addStatusHistoryComment(Mage::helper('hipay')->__('Notified customer about creditmemo #%s.', $creditmemo->getIncrementId()))->setIsCustomerNotified(true)->save(); } } break; default: $message = Mage::helper("hipay")->__('Message Hipay: %s. Status: %s', $gatewayResponse->getMessage(), $gatewayResponse->getStatus()); $order->addStatusToHistory($order->getStatus(), $message); break; } if ($gatewayResponse->getState() == self::STATE_COMPLETED) { if (in_array($gatewayResponse->getPaymentProduct(), array('visa', 'american-express', 'mastercard', 'cb')) && ((int) $gatewayResponse->getEci() == 9 || $payment->getAdditionalInformation('create_oneclick')) && !$order->isNominal()) { if ($customer->getId()) { $this->responseToCustomer($customer, $gatewayResponse); } } } $order->save(); break; case self::STATE_FORWARDING: $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), $newTransactionType, array('is_transaction_closed' => 0), array(), Mage::helper('hipay')->getTransactionMessage($payment, $requestType, $gatewayResponse->getTransactionReference(), $amount)); $payment->setIsTransactionPending(1); $order->save(); break; case self::STATE_DECLINED: if ($order->getStatus() == Mage_Sales_Model_Order::STATE_PROCESSING || $order->getStatus() == Mage_Sales_Model_Order::STATE_COMPLETE || $order->getStatus() == Mage_Sales_Model_Order::STATE_CLOSED) { // for logic process break; } $statusCode = (int) $gatewayResponse->getStatus(); $reason = $gatewayResponse->getReason(); $this->addTransaction($payment, $gatewayResponse->getTransactionReference(), $newTransactionType, array('is_transaction_closed' => 0), array($this->_realTransactionIdKey => $gatewayResponse->getTransactionReference(), $this->_isTransactionFraud => true), Mage::helper('hipay')->getTransactionMessage($payment, $requestType, null, $amount, true, "Code: " . $reason['code'] . " " . Mage::helper('hipay')->__("Reason") . " : " . $reason['message'])); if ($order->getState() == Mage_Sales_Model_Order::STATE_HOLDED) { $order->unhold(); } if (!($status = $this->getConfigData('order_status_payment_refused'))) { $status = $order->getStatus(); } if (in_array($statusCode, array(110))) { $this->_setFraudDetected($gatewayResponse, $customer, $payment, $amount, true); } if ($status == Mage_Sales_Model_Order::STATE_HOLDED && $order->canHold()) { $order->hold(); } elseif ($status == Mage_Sales_Model_Order::STATE_CANCELED && $order->canCancel()) { $order->cancel(); } $order->addStatusToHistory($status, Mage::helper('hipay')->getTransactionMessage($payment, $this->getOperation(), null, $amount, true, $gatewayResponse->getMessage())); $order->save(); break; case self::STATE_ERROR: default: Mage::throwException($defaultExceptionMessage); break; } }