PayPal Many Requests / RATE_LIMIT_REACHED

Hallo,

sobald viele Leute auf meinen Website sind macht PayPal dicht es und der Warenkorb läuft nicht mehr:

Fehlermeldung :

ACK: Success
status: 429
message: Too Many Requests
name: RATE_LIMIT_REACHED
debug_id: 712e781a6b449
shopware_version: 5.2.9
php_version: 7.0.12-1~dotdeb+8.1

PayPal meint dazu das liegt am Plgugin:

Hallo Marco,

 

die Meldung “message”:“Too many requests. Blocked due to rate limiting.” betrifft , du fragst bei jeder Zahlungsabwicklung nach einem neuen Access Token. Du musst den selben Access Token nutzen bis dieser abgelaufen ist. Der Access Token ist gute 8 Stunden gültig. Es muss also eine Logik zunächst prüfen ob der gespeicherte Access Token noch Gültig ist und dann entscheiden ob ein neuer Access Token generiert werden muss.

 
Hier ein Beispiel einer solchen Logik.

 

// Define Sandbos or Live ( change the # )
    $MODUS=0 ; // 0 = sandbox / 1 = live
    define(‘CURRENCYCODE’, ‘EUR’ );
    define(‘LOCALECODE’, ‘de_DE’ );
    define(‘PRICE_IS_NET’, false );
if (MODUS==1) {     define('PP\_MODUS','live');     define('PP\_DATA', 'data\_live.json');     define('PPURL','api.paypal.com');     define('PP\_CLIENTID', '' );     define('PP\_SECRET', '' ); }else{     define('PP\_MODUS','sandbox');     define('PP\_DATA', 'data\_test.json');     define('PPURL','api.sandbox.paypal.com');     define('PP\_CLIENTID', 'AX6xv28-EmeJqaMhnY\_XJaJxGeJh6101IMAKiiqBC2aJXfFGnefrswLfq1JYFdjqUQnxTB61F5N41Spa' );     define('PP\_SECRET', 'EOeiWqfwydwGVn2bHWOTTg6BHOvS-sZURVULlN5KDQmdSLOdtAjdfsERB11biNY1pog\_K7XUeMVQ0Lv9' ); }     define('BRAND\_NAME','PayPal Plus T-Shirt Shop');     define('URL\_RETURN', _SESSION[‘BASE_URL’].’/paypal/index.php?action=return’);
    define(‘URL_CANCLE’, $_SESSION[‘BASE_URL’].’/paypal/index.php?action=cancel’);
    define(‘URL_LOGO’, 'https://static.e-junkie.com/sslpic/137759.64a570be1ddd78ed2cb0d47d0d8ddbbc.jpg’);
    define(‘BANK_DATA’, ‘Bitte Zahlen an Test Company GmbH. IBAN DE93838031321080808’);

NO CHANGES BELOW !!

// set timzone
    date_default_timezone_set(‘UCT’);
// build API Credentials
    define(‘API_CREDENTIALS’, PP_CLIENTID.’:’.PP_SECRET);

 

function GetAccessToken(){
data\_url='logs/'.PP\_DATA; //Get Access Token if(empty(_SESSION[‘access_token’])){

check for valid access token

    $ts_now = time();
    $jsonDATA = (array) json_decode(file_get_contents( $data_url, true));
    if (!empty(jsonDATA)) {         _SESSION[‘expiry’] = jsonDATA['expiry'];         _SESSION[‘access_token’] = jsonDATA['access\_token'];         _SESSION[‘app_id’] = jsonDATA['app\_id'];         _SESSION[‘token_type’] = jsonDATA['token\_type'];         _SESSION[‘webprofilID’] = $jsonDATA[‘webprofilID’];
        } else { echo ’
ERROR - NO DATA’;}

    if ( $ts_now > $jsonDATA[‘expiry’] ) {
        $url=‘https://’.PPURL.’/v1/oauth2/token’;
        $JSONrequest= ‘grant_type=client_credentials’;

        $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                ‘Accept: application/json’,
                ‘Accept-Language: de_DE’
                ));
            curl_setopt($ch, CURLOPT_USERPWD, API_CREDENTIALS);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $JSONrequest);

        $result = curl_exec($ch);
        $resultGetAccessToken = json_decode($result,true);
        curl_close ($ch);

        $_SESSION[‘expiry’] = time() + resultGetAccessToken['expires\_in'];         _SESSION[‘access_token’] = resultGetAccessToken['access\_token'];         _SESSION[‘app_id’] = resultGetAccessToken['app\_id'];         _SESSION[‘token_type’] = $resultGetAccessToken[‘token_type’];
        $jsonSTRING = ‘{ “expiry”:"’.resultGetAccessToken['expiry'].'" , "access\_token":"'._SESSION[‘access_token’].’" , “app_id”:"’.\_SESSION['app\_id'].'","token\_type":"'._SESSION[‘token_type’].’",“webprofilID”:"’.$_SESSION[‘webprofilID’].’"}’;
        file_put_contents($data_url, $jsonSTRING);
    }
  }
}

 

Bei diesem Beispiel wird der AccessToken in einer Datei unter “/logs” gespeichert im JSON Format gespeichert.

Mit Freundlichen Grüssen
 

Welche Paypal Version hast du denn im Einsatz?
Nutzt du Paypal Plus?

[@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍ ich hatte PayPal  v 3.4.2 & Paypal v 1.2.0 im einsatz,

dieses Szenario hatte ich immer wenn ca 50-100 Leute zur gleichen Zeit Online sind die folge ist dann auch das die API nicht mehr zu erreichen ist mein Kompletter Warenkorb tot ist

 

Wir haben da bei Paypal Plus was mit dem neuen Update umgebaut in dieser Richtung.

Hallo Nama,

mit dem neusten Release von PayPal Plus haben wir die Anzahl dieser Requests verringert. Du solltest also mal das Update ausprobieren, ob das schon Besserung für dich bringt.

Viele Grüße aus Schöppingen

cool Michael Telgmann

  [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann „Michael Telgmann“)‍ [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski „Moritz Naczenski“)‍ okay dann muss eine Aktion Starten un zu sehen ob das was bringt
PayPal will noch versuchen die Gültigkeit von diesen Access Token runterzusetzten ? oder sollen wir das jetzt lieber lassen ?

PayPal schreibt ja das dieser Access Token im Normalfall 8 Stunden gültig ist, aber jeder Kunde erzeugt bei mir einen neuen Token d.h irgend wann ist die maximale Anzahl von anfragen erreicht und die Seite macht erst mal dicht… oder?

Hallo [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski “Moritz Naczenski”)‍ [@Michael Telgmann](http://forum.shopware.com/profile/17553/Michael Telgmann “Michael Telgmann”)‍

kannst du das so bestätigen?

>> hat da ein Kunde nur 15 Minuten zeit um zu bestellen?

Nein - ABER - wenn das Modul nicht vor dem Execute Payment prüft ob der Tocken noch aktuell ist wird es nach 15 Minuten zu einem anderen Fehler kommen.
Zum Verstäntiss - für jede API Anfrage wird der AuthorisierungsToken gebaucht. Die erste API Anfrage ist Create Payment.

Dann geht der Kunde zu PayPal und stimmt der Zahlung zu um dann zurück zum Shop zu kommen.

Nun wird die Execute Payment Anfrage ausgeführt. Vermutlich wurde das Modul so programmiert das es für beide API Anfragen den selben AuthToken benutzt, ohne die Gültigkeit zu püfen.

Genau das ist ja der Fehler, Der Schop macht einfach für jede Anfrage einen neuen Token und so kommen irgendwann so viele aktuelle Token zusammen das unser System “dicht macht”.

Verkürze ich die Gültigkeit wäre das Problem gelöst aber wenn dann ein Kunde mehr als 15 Minuten für den Checkout braucht knallte es weil der Token nun ungültig ist. Es gibt eine Einstellung von 1 Stunde Gültigkeit aber ich weiss nicht ob das wiederum ausreicht das Problem mit “Tomany Requests” zu beheben.

Ich sehe gerade, dass die Diskussion schon zwei Wochen im Gang ist.

Leider kann ich diese Fehlermeldung auch melden.

Sobald ich die REST API Daten des Plugins hinterlege und einen API check mache, erhalte die ebenfalls diese Meldung aus dem Backend.

Ich halte das für einen Bug, den ich mal im Ticket definiert habe:

Wir haben nun pünktlich im Weihnachtsgeschäft das gleiche Problem. PayPal hielt sich sehr lange zurück und erst nach Tagen Wartens und mehrmaligem Kontakt gab es eine knappe Antwort. Die Verantwortung wird einfach weggeschoben. Lächerlich, dass es noch keine Lösung gibt obwohl dem Händler und selbst PayPal so finanzielle Verluste entstehen. Hier die Antwort:

…Beispiel:

bei 110 Anfragen auf /v1/payments/payment

machen Sie nur 15 Execute /v1/payments/payment/{id}/execute

hierzu müssen Sie sich bitte an ihren Entwickler für das Modul wenden.

Ihr Shop/Modul macht einen hohen Trafik auf /v1/payments/payment und das wird geblockt (180min).

Dies muss von ihrer Seite her gelöst werden…

 

Hi Claus,

erfahrungsgemäß haben die Shopbetreiber oft kein technisches Verständnis.
Vielleicht wäre es vorteilhaft, die Änderung bereits als Pull-Request im Git anzuliefern:

Hallo zusammen,

wir haben das Problem bereits auf dem Schirm und werden uns zeitnah darum kümmern: http://issues.shopware.com/issues/PT-7128

Viele Grüße aus Schöppingen

 Michael Telgmann

Hallo best_MBMichael Telgmann

Entschuldigt wenn mein Post zu technisch war. Ich bin kein Experte für Shopware und wusste nicht mal das die Source auf Github ist. Ich werde mir diese einmal ansehen und wenn ich eine Möglichkeit für einen „Quick Fix“ sehe dann poste ich ihn dort.

Grüsse aus Dublin

Claus

 

 

@all: Wie ich sehen kann ist das Ticket http://issues.shopware.com/issues/PT-7128 nun gelöst worden.

Vielen Dank.

Hallo zusammen,

die vorläufige Entwicklerversion könnt ihr hier anschauen und herunterladen: GitHub - shopwareLabs/SwagPaymentPaypalPlus 

Beachtet bitte, dass dieser Stand u.U. nicht der Release Version entspricht, da das Plugin noch in der QA und in der Abnahme ist.

Viele Grüße aus Schöppingen

cool Michael Telgmann