1. Wenn Ihr uns das erste Mal besucht, lest euch bitte zuerst die Foren-Regeln durch.
    Information ausblenden

Neu PayPal Plugin v1.07 Open Beta

Dieses Thema im Forum "Plugins für JTL-Shop" wurde erstellt von david, 25. April 2017.

  1. JulianG

    JulianG Super-Moderator Mitarbeiter

    Registriert seit:
    14. November 2013
    Beiträge:
    44
    Zustimmungen:
    3
    Punkte für Erfolge:
    8
    Im Support müssen wir von den offiziellen Vorgaben ausgehen. Der JTL-Shop4 ist noch nicht für PHP 7.1 freigegeben, siehe dazu: https://guide.jtl-software.de/JTL-Shop_neu_installieren#Systemvoraussetzung
    Daher kommt vermutlich die Aussage, dass hier auf PHP 7.0 zurückgegriffen werden sollte.

    Unabhängig davon ob der Fehler durch PHP 7.1 verursacht wird oder nicht, muss er natürlich entsprechend untersucht werden: https://issues.jtl-software.de/issues/SHOP-2137
    Bisher ist das erst der zweite Fehler der in Verbindung mit PHP 7.1 gebracht wird.
     
  2. zttom

    zttom Neues Mitglied

    Registriert seit:
    13. Februar 2018
    Beiträge:
    2
    Zustimmungen:
    2
    Punkte für Erfolge:
    3
    Als Technologiepartner und Hoster mit dem betroffenen Kunden habe ich den Fehler nun mal analysiert und hoffe, dass der Fehler dadurch schnell mit einem Hotfix behoben werden kann, das Ticket geschlossen werden kann und solche Fehler nicht mehr auftreten ;-) @JTL: Bitte an Eure Entwickler weitergeben!

    Die Lösung liegt eigentlich schon in den Zeilen, die bbfdesign schon geschickt hatte. Entscheidend sind folgende Zeilen:

    "Error: Wrong parameters for Exception([string $message [, long $code [, Throwable $previous = NULL]]]) in"

    und

    /var/www/virtual/.../htdocs/includes/plugins/jtl_paypal/version/106/paymentmethod/class/PayPalPlus.class.php(569): Exception->__construct('Unhandled payme...', 'approved') #1

    Das Plugin schmeisst in der Zeile 569 von htdocs/includes/plugins/jtl_paypal/version/106/paymentmethod/class/PayPalPlus.class.php eine Exception wie folgt:

    throw new Exception('Unhandled payment state', $payment->getState());

    Der Status des Payment Objektes ist vom Typ String und nicht vom Typ long, weshalb vor der Exception eine andere Exception "Wrong Parameters for Exception" geschmissen wird.

    Gemäß "Upgrading to PHP 7, Davey, Shafik, 2016, O'Reilly" (echt gute Lektüre! Sehr empfehlenswert und gratis bei O'Reilly erhältlich) wird auf Seite 37 ff. beschrieben, dass alle internen Klassen (also auch die Exception Klasse) nun eine Exception schmeissen, wenn der Constructor fehlschlägt: Auch bei nicht übereinstimmenden Typen (string != long). Auf Seite 42 wird dies noch etwas vertieft. Auf Seite 42 findet sich dann der Hinweis, dass Standard PHP fatal errors (welcher der o.g. Fehler ist) nun als Exception geschmissen werden und auf Seite 43 dann der Hinweis, dass diese nicht mehr über den set_error_handler() abgefangen werden können.

    Lange Rede kurzer Sinn: Vor PHP 7 wurde die Exception in Zeile 569 des o.g. Codes auch schon falsch aufgerufen und der Fehler string != long existierte damit in PHP < 7.0 auch schon. Allerdings führte dies bei PHP < 7.0 nur dazu, dass der Fehler durch den jtlErrorHandler (Zeile 40 htdocs/includes/error_handler.php) geschluckt wurde und nur in den Logdateien zu sehen war. Das Plugin läuft dadurch an einer Stelle weiter, wo die Entwickler es aber durch den Aufruf der Exception beenden wollten.

    Somit ist der hier diskutierte "Fehler" kein PHP 7.1 Fehler, sondern ein PHP >= 7 Fehler, bzw. ein PHP < 7 Fehler - Ab PHP 7 wird ja eine Exception geschmissen, nur nicht die, die die Entwickler eigentlich vorhatten zu schmeissen ;-).

    Lösung des Problems: Korrektur der Zeile 569 in der Datei htdocs/includes/plugins/jtl_paypal/version/106/paymentmethod/class/PayPalPlus.class.php auf

    throw new Exception('Unhandled payment state', 4711);

    oder ähnliches. Der Parameter 2 des Constructors der Exception Klasse spiegelt nämlich nur einen durch den Entwickler definierbaren Fehlercode wieder, der zusammen mit der Exception-Message für den Entwickler eine schnelle Identifikation der Exception bieten soll. Der Status des Payment-Objektes ist der Exception-Klasse egal! Wenn dem Entwickler der Status wichtig ist, dann wäre so etwas denkbar:

    throw new Exception('Unhandled payment state: '.$payment->getState(), 4711);

    @JTL: Bitte prüft einmal, ob ihr diesen Fehler auch noch irgendwo anders eingebaut habt. Exceptions werden so selten geworfen, dass diese Fehler fast gar nicht auffallen.

    Natürlich ändert das nichts an der Tatsache, dass ihr "created" als Status erwartet und "approved" erhaltet. Aber, wenn Ihr doch wisst, dass Paypal etwas an der Rückgabe verändert habt und "approved" für Euch auch OK ist, dann baut doch als Hoffix 2 in der Zeile davor einfach ein:

    if ($payment->getState() != 'created' && $payment->getState() != 'approved') {

    Ich hoffe, ich konnte irgendwie helfen und die Kuh ist bald vom Eis ;-)
     
    Zuletzt bearbeitet: 14. Februar 2018
    css-umsetzung gefällt das.
  3. Xantiva

    Xantiva Aktives Mitglied

    Registriert seit:
    28. August 2016
    Beiträge:
    781
    Zustimmungen:
    77
    Punkte für Erfolge:
    28
    Ort:
    Düsseldorf
    Überschaubar schon, aber ein Verhalten hat sich geändert, was dort höchstens in den Kommentaren angerissen wird:

    https://forum.jtl-software.de/threads/amazon-payments-lpa-fuer-jtl-shop4.82264/page-8#post-584914

    Wenn eine Variable nicht als Array initialisiert wurde, dann aber später als Array-Variable verwendet wird, "knallt" es ab 7.1

    Wobei die v1.06 PayPal Basic läuft hier bislang fehlerfrei unter 7.1.
     
  4. zttom

    zttom Neues Mitglied

    Registriert seit:
    13. Februar 2018
    Beiträge:
    2
    Zustimmungen:
    2
    Punkte für Erfolge:
    3
    @Xantiva: Deine Aussage kann ich so nicht bestätigen. Das was Du meinst ist: "Ein String kann später nicht als Array" genutzt werden. Das ist richtig, ist aber sowieso schlechte Programmierung, wenn man es vorher so gemacht hat - nur weil es vorher funktionierte heisst es nicht, dass es gut war. Das hat aber nichts mit dem Fehler von bbfdesign zu tun.

    Der von bbfdesign diskutierte Fehler liegt im Aufruf des Constructors der Excpetion. Der Constructor der Exception wird in der PaypalPlus Klasse bis einschliesslich v1.07 falsch aufgerufen, wenn das Zahlungsobjekt an dieser Stelle einen Status != 'created' hat. Siehe auch https://issues.jtl-software.de/issues/SHOP-2137 . Der Fehler ist erst in der v108 behoben.

    Der Fehler führt mit PHP < 7 dazu, dass an der Stelle wo JTL eine Exception schmeissen möchte (also wenn der status != created ist), nie eine Exception geschmissen wird. Ich prüfe noch, ob damit durch einen Abbruch bei Paypal Plus, die Paywall umgangen werden konnte, was natürlich übel wäre.

    Weitere Ergänzungen mache ich jetzt nur noch im Issue-Tracker.
     
    Zuletzt bearbeitet: 14. Februar 2018
    bbfdesign gefällt das.
  5. JulianG

    JulianG Super-Moderator Mitarbeiter

    Registriert seit:
    14. November 2013
    Beiträge:
    44
    Zustimmungen:
    3
    Punkte für Erfolge:
    8
  6. Xantiva

    Xantiva Aktives Mitglied

    Registriert seit:
    28. August 2016
    Beiträge:
    781
    Zustimmungen:
    77
    Punkte für Erfolge:
    28
    Ort:
    Düsseldorf
    Vielleicht eine blöde Frage, aber wie aktualisiere ich Shop-Plugins (konkret das PayPal-Plugin)? Ich finde in der gesamten Doku / Guide keinen Hinweis auf ein Update, sondern immer nur auf die Installation.

    z.B.: https://guide.jtl-software.de/Plugins_für_JTL-Shop_verwalten

    Reicht es, ein bestehendes Modul vor dem Update zu deaktiveren, oder muss ich es deinstallieren (was wäre dann mit der Konfiguration)? Oder brauch ich überhaupt nur die neuen Daten hoch zu laden?

    Danke!
     
  7. Xantiva

    Xantiva Aktives Mitglied

    Registriert seit:
    28. August 2016
    Beiträge:
    781
    Zustimmungen:
    77
    Punkte für Erfolge:
    28
    Ort:
    Düsseldorf
    Ok, ich habe jetzt einfach mal die neue .zip Datei hochgeladen. Das reicht scheinbar aus, mir wird in der Pluginverwaltung angezeigt, dass ein Update vorliegt.

    Aber trotzdem wäre es schön, wenn das im Guide wenigstens mal erwähnt wird.
     

Diese Seite empfehlen

Verstanden Weitere Informationen

JTL-Software benutzt Cookies, teilweise von Drittanbietern, um Funktionalitäten auf unseren Webseiten zu ermöglichen.