/** * notification about status change */ public function notificationAction() { set_error_handler('sofort_notification_error'); // prevent to submit confirm/cancel back $GLOBALS['isNotificationAction'] = true; $response = $this->getRequest()->getParams(); $orderId = $response['orderId']; $secret = $response['secret']; // read notofication $sofort = new SofortLib_Notification(); $transaction = $sofort->getNotification(); //no valid parameters/xml if (empty($orderId) || empty($transaction)) { Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__ . " - " . $orderId . " - " . $transaction); return; } if ($sofort->isError()) { Mage::log($sofort->getError(), Zend_Log::ERR, 'sofort_error.log'); } // load current transaction data $transData = new SofortLib_TransactionData(Mage::getStoreConfig('payment/sofort/configkey')); $transData->setTransaction($transaction)->sendRequest(); if ($transData->isError()) { Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__ . $transData->getError()); return; } $order = Mage::getModel('sales/order'); $order->loadByIncrementId($orderId); $paymentObj = $order->getPayment()->getMethodInstance(); $payment = $order->getPayment(); //data of transaction doesn't match order if ($payment->getAdditionalInformation('sofort_transaction') != $transaction || $payment->getAdditionalInformation('sofort_secret') != $secret) { Mage::log('Notification invalid: ' . __CLASS__ . ' ' . __LINE__); return; } // BUGFIX // if notification for confirm + refund got the same, we need to confirm first if ($transData->isSofortrechnung() && $transData->isRefunded() && !$order->hasInvoices()) { $this->_transactionConfirmed($transData, $order, true); // reload order $order = Mage::getModel('sales/order'); $order->loadByIncrementId($orderId); } // check if order was edit $sofortRechnung = Mage::getModel('pnsofortueberweisung/sofortrechnung'); $sofortRechnung->updateOrderFromTransactionData($transData, $order); // check if something other change if ($payment->getAdditionalInformation('sofort_lastchanged') === $this->_getLastChanged($transData)) { return; } $payment->setAdditionalInformation('sofort_lastchanged', $this->_getLastChanged($transData))->save(); // kauf auf Rechnung if ($transData->isSofortrechnung()) { if ($transData->isLoss()) { $this->_transactionLoss($transData, $order); } elseif ($transData->isPending() && $transData->getStatusReason() == 'confirm_invoice') { $this->_transactionUnconfirmed($transData, $order); } elseif ($transData->isPending()) { $this->_transactionConfirmed($transData, $order); } elseif ($transData->isReceived()) { //don't do anything } elseif ($transData->isRefunded()) { $this->_transactionRefunded($transData, $order); } else { //uups $order->addStatusHistoryComment($transData->getStatus() . " " . $transData->getStatusReason()); } // sofortueberweisung, lastschrift } else { if ($transData->isLoss()) { $this->_transactionLoss($transData, $order); } elseif ($transData->isPending()) { $this->_transactionConfirmed($transData, $order); } elseif ($transData->isReceived()) { // no status change on received $this->_transactionReceived($transData, $order); } elseif ($transData->isRefunded()) { $this->_transactionRefunded($transData, $order); } else { //uups $order->addStatusHistoryComment($transData->getStatus() . " " . $transData->getStatusReason()); } } $order->save(); }