Paypal Express Modul

Hi, wollt mal nachfragen ob es aktuell für Oxid 6 ein Paypal Express modul gibt? Bzw eines für geringere Versionen was einfach an zu passen ist.
Wir haben das PayPal Plus module im Einsatz, wo allerdings kein Express checkout/button mit dabei ist.

1 Like

was gefällt Dir an dem Paypal Modul, das zusammen mit OXID 6 ausgeliefert wird, nicht?

Oh ha das ist das mit dem feuer symbol oben rechts oder? Da ist ja paypal express dabei, das habe ich mir gar nicht angeschaut.
Auf die schnelle, was ist denn der Fehler: Fehlermeldung von PayPal: Security header is not valid

Https vorhanden? Ggf Fehler in der api zugangsdaten

ja geht, copy paste von paypal hat leerzeichen beim passwort mit kopiert.
Läuft eber ganz gut das modul.

Allerdings habe ich noch ein Problem

Nachträgliches editieren (nachdem man von paypal zurück kommt ) z.B. von der Adresse, wirft mich zurück wo Gastbestellungen ihre Daten eintragen und Navigiert mich dann aber nicht wieder zurück zu dem Bestellabschluss ( Überprüfen & absenden) sondern dann normal wie für gastbestellungen zu Versand und Zahlungen wo der Kunde dann den Zahlprozess quasi noch mal durchlaufen muss, aber er kein paypal express mehr findet.

das kenn ich von anderen (nicht-oxid) Shops aber auch und glaube, dass das gewollt ist.
Der Hintergrund ist, dass für den Käuferschutz die Adresse in der Bestellung exakt mit der Adresse bei Paypal übereinstimmen muss.
Die Idee von Paypal Express ist, dass die Daten von Paypal an den Shop übertragen werden und die Bestellung direkt abgeschlossen wird. Die nachträgliche Änderung der Daten im Shop bewirkt aber, dass diese wieder zu Paypal übertragen werden müssen, also läuft es auf die normale “nicht-express” Bestellung hinaus.

wenn ich die dsgvo aber richtig im kopf habe, so sind wir doch verpflichtet dem Kunden vor dem “jetzt kostenpflichtig kaufen” buttton alle daten noch mal an zu zeigen und diese auch editierbar zu machen.
Und wenn ich paypal richtig verstanden habe, so sind nachträgliche änderungen bis zu 30 min nach der zahlungsautorisierung immer noch möglich.

Wenn ich das so lassen würde, dann bin ich mir sicher, dass es da dutzende extremst verwirrte Kunden geben wird, die Anrufen weil Sie schon bezahlt haben und sie jetzt noch einmal bezahlen sollen…

@vanilla_thunder

Beim migrieren zur Live Umgebung von der Vagrant VM(wo alles funktioniert) bin ich im Live system jetzt doch noch auf einen interessanten Fehler gestoßen. Habe gesehe, dass der hier auch schon einmal nachgefragt wurde, leider ohne antwort.

und zwar bekomme ich nach zahlungsabschluss auf PayPal wo er mich dan zum Shop zurück leitet
Fehlermeldung von PayPal: Invalid token.
und
Der Warenkorb ist leer.

Paypal Modul Log:

Hier wird um 2018-10-25 17:07:26 der Token als null zurück gegeben. Weist du was da falsch sein könnte?

======================= Request to PayPal [2018-10-25 17:06:49] ======================= #

SESS ID: 7adtqk4bm856isvcja01a518e7
array (
  'VERSION' => '84.0',
  'PWD' => 'password',
  'USER' => 'user',
  'SIGNATURE' => 'signature',
  'CALLBACKVERSION' => '84.0',
  'LOCALECODE' => 'de_DE',
  'SOLUTIONTYPE' => 'Mark',
  'BRANDNAME' => 'my.com',
  'CARTBORDERCOLOR' => '2b8da4',
  'RETURNURL' => 'https://www.my.com/index.php?lang=0&sid=7adtqk4bm856isvcja01a518e7&rtoken=c08d2a42&shp=1&cl=oepaypalexpresscheckoutdispatcher&fnc=getExpressCheckoutDetails',
  'CANCELURL' => 'https://www.my.com/index.php?lang=0&sid=7adtqk4bm856isvcja01a518e7&rtoken=c08d2a42&shp=1&cl=basket',
  'PAYMENTREQUEST_0_PAYMENTACTION' => 'Sale',
  'CALLBACK' => 'https://www.my.com/index.php?lang=0&sid=7adtqk4bm856isvcja01a518e7&rtoken=c08d2a42&shp=1&cl=oepaypalexpresscheckoutdispatcher&fnc=processCallBack',
  'CALLBACKTIMEOUT' => 6,
  'NOSHIPPING' => '2',
  'PAYMENTREQUEST_0_AMT' => '144.76',
  'PAYMENTREQUEST_0_CURRENCYCODE' => 'EUR',
  'PAYMENTREQUEST_0_ITEMAMT' => '130.80',
  'PAYMENTREQUEST_0_SHIPPINGAMT' => '13.96',
  'PAYMENTREQUEST_0_SHIPDISCAMT' => '0.00',
  'L_SHIPPINGOPTIONISDEFAULT0' => 'true',
  'L_SHIPPINGOPTIONNAME0' => 'Standardversand',
  'L_SHIPPINGOPTIONAMOUNT0' => '13.96',
  'PAYMENTREQUEST_0_DESC' => 'Ihre Bestellung bei my.com in Höhe von 144,76 EUR',
  'PAYMENTREQUEST_0_CUSTOM' => 'Ihre Bestellung bei my.com in Höhe von 144,76 EUR',
  'MAXAMT' => '175.76',
  'L_PAYMENTREQUEST_0_NAME0' => 'somearticle',
  'L_PAYMENTREQUEST_0_AMT0' => '32.70',
  'L_PAYMENTREQUEST_0_QTY0' => 4,
  'L_PAYMENTREQUEST_0_ITEMURL0' => 'https://www.my.com/Winterreifen/somearticle.html',
  'L_PAYMENTREQUEST_0_NUMBER0' => 'X0WX8',
  'EMAIL' => '[email protected]',
  'PAYMENTREQUEST_0_SHIPTONAME' => 'Name famname',
  'PAYMENTREQUEST_0_SHIPTOSTREET' => 'w.Str. 13',
  'PAYMENTREQUEST_0_SHIPTOCITY' => 'Hannover',
  'PAYMENTREQUEST_0_SHIPTOZIP' => '30559',
  'PAYMENTREQUEST_0_SHIPTOPHONENUM' => '',
  'PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE' => 'DE',
  'METHOD' => 'SetExpressCheckout',
)

======================= Response from PayPal [2018-10-25 17:06:50] ======================= #

SESS ID: 7adtqk4bm856isvcja01a518e7
array (
  'TOKEN' => 'EC-9W218682R2024114P',
  'TIMESTAMP' => '2018-10-25T15:06:50Z',
  'CORRELATIONID' => '701128b0d1063',
  'ACK' => 'Success',
  'VERSION' => '84.0',
  'BUILD' => '49798231',
)

======================= Request to PayPal [2018-10-25 17:07:26] ======================= #

SESS ID: 7c919mbjvu42b63rg1kj7hif85
array (
  'VERSION' => '84.0',
  'PWD' => 'password',
  'USER' => 'user',
  'SIGNATURE' => 'signature',
  'TOKEN' => NULL,
  'METHOD' => 'GetExpressCheckoutDetails',
)

======================= Response from PayPal [2018-10-25 17:07:27] ======================= #

SESS ID: 7c919mbjvu42b63rg1kj7hif85
array (
  'TIMESTAMP' => '2018-10-25T15:07:27Z',
  'CORRELATIONID' => '79bc3a40cd398',
  'ACK' => 'Failure',
  'VERSION' => '84.0',
  'BUILD' => '49798231',
  'L_ERRORCODE0' => '10410',
  'L_SHORTMESSAGE0' => 'Invalid token',
  'L_LONGMESSAGE0' => 'Invalid token.',
  'L_SEVERITYCODE0' => 'Error',
)

=======================  [2018-10-25 17:07:27] ======================= #

SESS ID: 7c919mbjvu42b63rg1kj7hif85
array (
  'PayPal_error:_Fehlermeldung_von_PayPal:_Invalid_token_' => '',
)

Dieser Fehler hat sich selbst behoben.
Möglicherweise in Zusammenhang mit Sandbox. Server Problemen die gestern bestanden.

Von Paypal habe ich allerdings folgenden Mängel bekommen zu dem Modul bekommen

Wir bekommen die Bestellnummer als Artikelname zurück, das ist leider suboptimal. Es kann aber leider am OXID Modul liegen. Normalerweise haben wir einen Parameter invnum, der die Rechnungsnummer traegt und alle Artikeldetails werden über die itemxxx Parameter übergeben. Gibt es in OXID eine Funktion die Details an PayPal zu übergeben? Es geht hier um den Verkäuferschutz, gegeben ist dieser doch es ist weitaus einfacher irgendwelche Beschwerden zu bearbeiten, wenn wir wissen was verkauft/versandt wurde. Vor allem bei höherpreisigen Warenkoerben.

Die Einstellung → Warenkorb bei PayPal anzeigen scheint keine Wirkung zu haben

Vergleich mit paypal Plus modul

Ich habe das jetzt so abgeändert!

In der Datei DoExpressCheckoutPaymentRequestBuilder.php
habe ich folgenden aufruf hinzugefügt
$this->addBasketItemParams();

Und zwar in Zeile 358 nach PAYMENTREQUEST_0_CUSTOM

Zudem habe ich folgende funktion hinzugefügt, die ich aus SetExpressCheckoutRequestBuilder.php kopiert und leicht abgeändert habe.

/**
     * Sets basket items parameters to request.
     */

    public function addBasketItemParams()
    {
        $basket = $this->getBasket();
        $lang = $this->getLang();
        //$request = $this->getPayPalRequest();
        $request = $this->getRequest();

        $pos = 1;
        foreach ($basket->getContents() as $basketItem) {
  
            $request->setParameter("L_PAYMENTREQUEST_0_NAME{$pos}", \OxidEsales\Eshop\Core\Str::getStr()->html_entity_decode($basketItem->getTitle()));
            $request->setParameter("L_PAYMENTREQUEST_0_AMT{$pos}", $this->formatFloat($basketItem->getUnitPrice()->getPrice()));
            $request->setParameter("L_PAYMENTREQUEST_0_QTY{$pos}", (int) $basketItem->getAmount());
            $request->setParameter("L_PAYMENTREQUEST_0_ITEMURL{$pos}", $basketItem->getLink());

            $basketProduct = $basketItem->getArticle();
            $request->setParameter("L_PAYMENTREQUEST_0_NUMBER{$pos}", $basketProduct->oxarticles__oxartnum->value);
            $pos++;
        }

        //adding payment costs as product
        if ($basket->getPayPalPaymentCosts() > 0) {
            $paymentTitle = $lang->translateString("OEPAYPAL_SURCHARGE") . " " . $lang->translateString("OEPAYPAL_TYPE_OF_PAYMENT");
            $request->setParameter("L_PAYMENTREQUEST_0_NAME{$pos}", $paymentTitle);
            $request->setParameter("L_PAYMENTREQUEST_0_AMT{$pos}", $this->formatFloat($basket->getPayPalPaymentCosts()));
            $request->setParameter("L_PAYMENTREQUEST_0_QTY{$pos}", 1);

            $pos++;
        }

        //adding wrapping as product
        if ($basket->getPayPalWrappingCosts() > 0) {
            $request->setParameter("L_PAYMENTREQUEST_0_NAME{$pos}", $lang->translateString("OEPAYPAL_GIFTWRAPPER"));
            $request->setParameter("L_PAYMENTREQUEST_0_AMT{$pos}", $this->formatFloat($basket->getPayPalWrappingCosts()));
            $request->setParameter("L_PAYMENTREQUEST_0_QTY{$pos}", 1);

            $pos++;
        }

        //adding greeting card as product
        if ($basket->getPayPalGiftCardCosts() > 0) {
            $request->setParameter("L_PAYMENTREQUEST_0_NAME{$pos}", $lang->translateString("OEPAYPAL_GREETING_CARD"));
            $request->setParameter("L_PAYMENTREQUEST_0_AMT{$pos}", $this->formatFloat($basket->getPayPalGiftCardCosts()));
            $request->setParameter("L_PAYMENTREQUEST_0_QTY{$pos}", 1);

            $pos++;
        }
        if ($basket->getDeliveryCosts() > 0){
            $delivery = oxNew(\OxidEsales\Eshop\Application\Model\DeliverySet::class);
            $deliveryName = ($delivery->load($basket->getShippingId())) ? $delivery->oxdeliveryset__oxtitle->value : "#1";

            $request->setParameter("L_PAYMENTREQUEST_0_NAME{$pos}", $deliveryName);
            $request->setParameter("L_PAYMENTREQUEST_0_AMT{$pos}", $this->formatFloat($basket->getDeliveryCosts()));
            $request->setParameter("L_PAYMENTREQUEST_0_QTY{$pos}", 1);

            $pos++;
        }
    }

evtl kann das ja mal einer prüfen und commiten

Hier habe ich jetzt noch

in die Funktion addBaseParams() folgende Zeite unter “PAYMENTREQUEST_0_CUSTOM” gesetzt

$request->setParameter("PAYMENTREQUEST_0_INVNUM", $order->oxorder__oxordernr->value);

Das ist bei Paypal das Feld für die Rechnungnummer. Da diese bei uns erst später generiert wird geben wir einfach die Bestellnummer.
Wer die Rechnungsnummer übergeben will sollte dann also “oxorder__oxbillnr” anstatt “oxorder__oxordernr” benutzen

Das gleiche Verhalten haben wir auch mit dem OE Paypal Modul 3.2.3 für CE 4.10.7. Die Anpassungen habe ich versucht, erhalte aber die Offlineseite, sobald von Paypal zurück geleitet werde und “Zahlungspflichtig bestellen” bediene.

Moin,

hast du diesen hier aktiviert?

Wir haben OE\paypal Version 5.2.2

Das sieht in der CE 4.10.X Version 3.2.3 anders aus. Da gibt es diesen Eintrag nicht. Dieses Modul setzen wir ein: https://github.com/OXID-eSales/paypal/

Ja das ist natürlich etwas anders. bekommst du denn irgend eine Fehlermeldung?

Nein, eine Fehlermeldung gab es nicht, nur die Offlineseite.