Payone 3.3.11 mit Fehler

Leider hat die aktuelle Payone Version einen Fehler welcher hoffentlich kurzfristig von Payone geprüft wird. Hierbei bleiben einige Transaktionen auf Running stehen, Rechnungen werden nicht erstellt und der Kunde erhält keine Bestellbestätigung. Generell ist der Fehler durch Payone noch nicht bestätigt.

Im system.log Log ist Fehler durch folgende Zeile sichtbar:

2015-09-01T08:25:46+00:00 ERR (3):
Warning: include(Payone/Core/Model/Observer/TransactionStatus/Forwarding.php):
failed to open stream: No such file or directory

Laut Payone wurde die Datei Payone/Core/Model/Observer/TransactionStatus/Forwarding.php entfernt.
Sie wird im config.xml als Observer jedoch noch verwendet.

<payone_core_transactionstatus_all>
  <observers>
    <payone_core_observer_forwarding>
    <type>singleton</type>
    <class>payone_core/observer_transactionStatus_forwarding</class>
    <method>onAll</method>
    </payone_core_observer_forwarding>
    </observers>
</payone_core_transactionstatus_all>

So lange man nur eine Transaction verarbeitet ist das alles nicht so schlimm. Dann versucht Magento das Model zu laden, registriert es, über die Mage::getSingleton(), in der Registry und stellt fest das er auf "false" die Methode "onAll" nicht aufrufen kann. Alles ist gut.

Verarbeitet das Modul jedoch nun den die zweite Transaction wird das Event payone_core_transactionstatus_all wieder geworfen. Nun kommt der Bug.

Magento prüft, ob das Singleton bereits registriert ist, und bekommt das false des nicht existierenden Models zurück:

public static function getSingleton($modelClass='', array $arguments=array())
{
  $registryKey = '_singleton/'.$modelClass;
  if (!self::registry($registryKey)) {
    self::register($registryKey, self::getModel($modelClass, $arguments));
  }
  return self::registry($registryKey);
}

Hier muss man nun wissen wie die registry-Methode in Magento generell arbeitet:

public static function registry($key)
{
  if (isset(self::$_registry[$key])) {
    return self::$_registry[$key];
  }
  return null;
}

Nun registriert Magento den tollen Singleton noch mal und wir bekommen eine Exception.

Fatal error: Uncaught exception 'Mage_Core_Exception' with message
'Mage registry key "_singleton/payone_core/observer_transactionStatus_forwarding"
already exists' in [..]/htdocs/app/Mage.php on line 595

Mage_Core_Exception: Mage registry key
"_singleton/payone_core/observer_transactionStatus_forwarding"
already exists in [..]/htdocs/app/Mage.php on line 595

Als Lösung hilft es den falschen Observer im Source des Moduls auszukommentieren. Generell vielleicht auch auf einen offiziellen Bugfix warten :-)



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Michael Leiss am

Das ist nicht der einzige Fehler in der Erweiterung, z.B. ist für die IPN-Meldungen keine Ausnahmeregel für Mage_Log angelegt. Da Payone mit IPN Requests nicht gerade geizt - können schon mal 10 Requests pro Sekunde sein - wird jeder Payone-IPN-Request im Visitor Log erfasst und es gibt Deadlocks, da die Payone DB-Transkationen alles andere als performant/elegant sind. Gilt nur für hochfrequentierte Shops.

Lars Falkenhain am

Hi Tobi,

hast du auch eine ETA für das fertige Release? Gibt es weitere Änderungen als den ausgebauten Observer?

Tobias Vogt am

Neuer Stand: Payone hat den Fehler akzeptiert und mir eine neues Beta-Release geschickt :)

Don Bosco van Hoi am

Hallo Tobi,

wir können das Problem ebenfalls bestätigen. Momentaner Status ist wohl, dass PayOne diesen Fehler nicht auf die eigene Kappe nimmt. "Bei anderen Kunden geht es ja auch"

Benjamin Wunderlich am

Wir können den Fehler bestätigen und haben ihn heute auch schon mit Payone besprochen. So ganz wollten die das noch nicht einsehen.

luemic am

Hi,

sollte es nicht ausreichen, den Event zu disablen, so dass er nicht mehr gefeuert wird?

Dein Kommentar