Hallo Community,
wir setzen in unserem Shop (Version 5.5.1) das Plugin von Sofortüberweisung ein.
Die derzeit eingesetzte Version ist die 1.0.0.
Leider konnten wir bisher nicht updaten, da die neue Version des Plugins (1.1.2) bei uns bisher nicht funktioniert hat.
Immer wenn man im Checkout auf zahlungspflichtig bestellen klickt, landet man auf dem account und nicht auf der PaymentPage von Sofort.
Nachdem keine neue Version erschienen ist und der Hersteller für das Plugin keinen Support anbietet, haben wir uns jetzt mal den Quelltext angesehen und die Ursache rausgesucht.
In custom/plugin/SofortPay/Controllers/Frontend/SofortPayment.php git es die Methode preDispatch().
In dieser wir über die Methode getCustomerNumber() (liegt in der selben Datei) versucht die Kundennummer zu holen.
public function preDispatch()
{
$this->service = $this->container->get('sofort_pay.components.payment_service');
$this->config = $this->service->getConfig();
$this->logger = Shopware()->Container()->get('sofort_pay.sofort_logger');
if (in_array($this->Request()->getActionName(), ['notify'])) {
Shopware()->Plugins()->Controller()->ViewRenderer()->setNoRender();
} else {
$this->customerNumber = $this->getCustomerNumber();
// Hier wird geprüft, ob eine Kundennummer vorliegt. Wenn nicht, dann redirect auf account.
// Erklärt sich nicht, weil
// 1. Gastbesteller haben keine Kundennummer
// 2. In Grundeinstellungen->Storefront->Anmeldung/Registrierung kann das Generieren von Kundennummern abgeschaltet werden.
// In unserem Fall übernimmt das ERP die Generierung der Kundennummern.
// Daher die Methode getCustomerNumber() umgestellt auf user->id.
if (empty($this->customerNumber)) {
$this->redirect(['controller' => 'account']);
}
}
$this->sofortPay = Shopware()->Container()->get('kernel')->getPlugins()['SofortPay'];
}
wie in den Kommentaren beschrieben führt dies in unserem Fall dazu, dass der Kunde immer in seinem Account landet, sofern es seine erste Bestellung ist und er noch keine Kundenummer hat oder er als Gast bestellt. Er gelangt niemals zur PaymentPage von Sofort.
Als Lösung haben wir daher die Methode getCustomerNumber() wie folgt angepasst.
protected function getCustomerNumber()
{
$user = $this->getUser();
// $user['additional']['user']['customernumber'] ist eine schlechte Wahl, um Kunden zu identifizieren/den Login sicherzustellen oder warum auch immer das abgefragt wird.
// Die Vergabe von Kundennummern kann in den Grundeinstellungen->Storefront->Anmeldung/Registrierung
// abgeschaltet werden. Außerdem haben Gastbesteller keien Kundennummer. (Bei uns vergibt das ERP System die Kundennummern).
// In Folge dessen würde die Method preDispatch immer nur auf den Account weiterleiten.
// Alternativ auf user->id umgestellt.
// $customerNumber = $user['additional']['user']['customernumber'];
$customerNumber = $user['additional']['user']['id'];
...
Es wäre schön, wenn Ihr hier Feedback geben könntet, ob irgendwas dagegen spricht, die userId zu nehmen.
Eventuell hat auch jemand anderes das selbe Problem und kann es so lösen.
Viele Grüße
Mathias