PayPal Modul: CURL Error 77

Hallo zusammen,
ich habe plötzlich ein Problem mit dem Standard OXID PayPal-Modul 3.1.2. meiner alten OXID CE 4.8.3-Installation. Beim Checkout wirft es einen “Curl error: 77” aus. Geändert habe ich nichts an der Installation.
Hat jemand eine Idee, wo ich nach Ursachen forschen kann?

Das SSL-Zertifikat ist gültig und ist zuletzt am 13.10. erneuert worden. Die letzte erfolgreiche PayPal-Zahlung war außerdem nach der letzten Aktualisierung, nämlich am 27.10.

Das Exception-Log sagt:

oxException (time: 2018-11-05 10:46:19): [0]: Curl error: 77
Stack Trace: #0 /srv/www/######/html/core/oxutilsobject.php(193): oxUtilsObject->_getObject(‘oepaypalexcepti…’, 1, Array)
#1 [internal function]: oxUtilsObject->oxNew(‘oePayPalExcepti…’, ‘Curl error: 77’)
#2 /srv/www/######/html/core/oxfunctions.php(383): call_user_func_array(Array, Array)
#3 /srv/www/######/html/modules/oe/oepaypal/core/oepaypalcurl.php(357): oxNew(‘oePayPalExcepti…’, ‘Curl error: 77’)
#4 /srv/www/######/html/modules/oe/oepaypal/core/oepaypalcurl.php(309): oePayPalCurl->_execute()
#5 /srv/www/######/html/modules/oe/oepaypal/core/oepaypalcaller.php(141): oePayPalCurl->execute()
#6 /srv/www/######/html/modules/oe/oepaypal/core/oepaypalservice.php(276): oePayPalCaller->call()
#7 /srv/www/######/html/modules/oe/oepaypal/models/oepaypalipnrequestverifier.php(216): oePayPalService->doVerifyWithPayPal(Object(oePayPalPayPalRequest), ‘windows-1252’)
#8 /srv/www/######/html/modules/oe/oepaypal/models/oepaypalipnrequestverifier.php(186): oePayPalIPNRequestVerifier->_doVerifyWithPayPal(Array)
#9 /srv/www/######/html/modules/oe/oepaypal/controllers/oepaypalipnhandler.php(158): oePayPalIPNRequestVerifier->requestCorrect()
#10 /srv/www/######/html/modules/oe/oepaypal/controllers/oepaypalipnhandler.php(128): oePayPalIPNHandler->requestValid()
#11 /srv/www/######/html/core/oxview.php(540): oePayPalIPNHandler->handleRequest()
#12 /srv/www/######/html/core/oxshopcontrol.php(345): oxView->executeFunction(‘handleRequest’)
#13 /srv/www/######/html/core/oxshopcontrol.php(124): oxShopControl->_process(‘oePayPalIPNHand…’, ‘handleRequest’, NULL, NULL)
#14 /srv/www/######/html/core/oxid.php(40): oxShopControl->start()
#15 /srv/www/######/html/index.php(28): OXID::run()
#16 {main}

Auf dem Webserver läuft PHP 5.3.29 und CURL in der Version 7.53.1

P.S.: Der Shop wird in wenigen Wochen mit einer aktuellen OXID-Version neu installiert, in einer Umgebung mit aktueller PHP-Version. Leider nützt mir das im Moment nichts, da ich in der Zwischenzeit trotzdem gerne weiter PayPal-Zahlungen akzeptieren würde.

das Problem ist hier nicht das Zertifikat des Shops sondern das Zusammenspiel von deinem Server und Paypal. Der OXID baut im Hintergrund SSL Verbindungen zu Paypal auf, da liegt das Problem. Vermutlich ist deine SSL/Curl Version zu alt auf dem Server. Das kannst du testen in dem du einfach über die Console mit Curl eine Verbindung zu Papal machst.

Danke schon mal für den Hinweis. Ich bin nicht ganz sicher, was ich über Konsole eingeben muss und habe es mit diesem Fundstück aus einer Google-Suche versucht (ID, Passwort und Signatur natürlich eingesetzt):

curl https://api-3t.sandbox.paypal.com/nvp -s --insecure -d USER=YourUserID -d PWD=YourPassword -d SIGNATURE=YourSignature -d METHOD=SetExpressCheckout -d VERSION=98 -d PAYMENTREQUEST_0_AMT=10 -d PAYMENTREQUEST_0_CURRENCYCODE=USD -d PAYMENTREQUEST_0_PAYMENTACTION=SALE -d cancelUrl=https://example.com/cancel -d returnUrl=https://example.com/success

Das Resultat war:
TIMESTAMP=2018%2d11%2d21T10%3a24%3a10Z&CORRELATIONID=2ff4b8ba2a010&ACK=Failure&VERSION=98&BUILD=000000&L_ERRORCODE0=10002&L_SHORTMESSAGE0=Security%20error&L_LONGMESSAGE0=Security%20header%20is%20not%20valid&L_SEVERITYCODE0=Error[

Also irgendwas mit “Header not valid”. Bin mir jetzt nicht sicher, ob das jetzt schon einen Hinweis auf das Problem liefert oder einfach nur daran liegt, dass der Aufruf nicht die richtige Form hatte…

schonmal nicht…

was sagt einfach nur

curl https://api-3t.sandbox.paypal.com/nvp -I

Das gibt zurück:

HTTP/1.1 200 OK
Date: Wed, 21 Nov 2018 10:34:02 GMT
Server: Apache
Connection: close
HTTP_X_PP_AZ_LOCATOR: sandbox.slc
Paypal-Debug-Id: 1f466ce3c70c1
Set-Cookie: X-PP-SILOVER=name%3DSANDBOX3.API.1%26silo_version%3D1880%26app%3Dappdispatcher_apit%26TIME%3D2587161947%26HTTP_X_PP_AZ_LOCATOR%3Dsandbox.slc; Expires=Wed, 21 Nov 2018 11:04:02 GMT; domain=.paypal.com; path=/; Secure; HttpOnly
Set-Cookie: X-PP-SILOVER=; Expires=Thu, 01 Jan 1970 00:00:01 GMT
Content-Length: 146
Content-Type: text/plain; charset=utf-8

Hi floko2,

der Fehler “Security Header not valid” den die API zurückliefert kann folgende Ursachen haben:

  • Falsche TLS Version (kleiner 1.2)
  • Alte Version OpenSSL Version
  • Altes PayPal Konto (PayPal hat für die API Daten je nach Art des Kontos eine maximale Laufzeit), Daten müssen einfach nur neu generiert werden.

Aufgrund der Verwendung von PHP 5.3 tippe ich auf eine der ersten beiden Optionen. Sollte dein Server TLS 1.2 unterstützen liegts am Modul.
In älteren PayPal Modulen die TLS Version hardcoded hinterlegt, ein CoreHack hilft :wink:

Gruss Stefan

1 Like

Danke für die vielen Tipps!
Ich habe auf dem Server TLS v. 1.2, das sollte also OK sein, wenn ich das richtig verstehe.
Das SSL-Zertifikat kommt von Let’s Encrypt.
Als Library wird mir angezeigt: “OpenSSL/1.0.2k-fips” - ist das eine untaugliche Version?
Falls ja, kann ich daran was ändern, solange ich noch die alte PHP-Version habe?

Das mit dem veralteten PayPal-Konto versuche ich mal parallel rauszufinden.

Hi floko2,

welche OXID Version und welche PayPal Modul Version verwendet du ?
Das SSL Zertifikat ist egal.

Gruss Stefan

Zumindest für die nächsten Wochen ist das noch:
Oxid CE 4.8.3
Oxid PayPal-Modul 3.1.2.

Zwischenzeitlich hab ich mich noch mal bei PayPal eingeloggt, die Daten unter API Signature sind noch unverändert und werden nicht als inaktiv angezeigt oder so.

Hi,

guck mal in die Datei modules\oe\oepaypal\core\oepaypalcurl.php
Dort gibt es das Array protected $_aEnvironmentParameters
Das ist das Setting was bei einem Kunden von mir das Verhalten gelößt hat

protected $_aEnvironmentParameters = array(
    'CURLOPT_VERBOSE' => 0,
    'CURLOPT_SSL_VERIFYPEER' => false,
    'CURLOPT_SSL_VERIFYHOST' => false,
    'CURLOPT_SSLVERSION'     => 6,
    'CURLOPT_RETURNTRANSFER' => 1,
    'CURLOPT_POST' => 1,
    'CURLOPT_HTTP_VERSION' => CURL_HTTP_VERSION_1_1,
);

‘CURLOPT_SSLVERSION’ => 6 steht für TLS 1.2 und HTTP 1.1 ist inzwischen auch pflicht.

Wegend er Zugangsdaten bau dir nen einfaches Formular trag deine Daten ein, bekommste nen Token zurück sind diese gültig

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>PaypalTest</title>
  </head>
  <body>
    <form method=post action=https://api-3t.paypal.com/nvp>
        <input type=hidden name=USER value=mySandBoxAccount>
        <input type=hidden name=PWD value=myPWD>
        <input type=hidden name=SIGNATURE value=mySignature>
        <input type=hidden name=VERSION value=204>
        <input type=hidden name=PAYMENTREQUEST_0_PAYMENTACTION value=Sale>
        <input name=PAYMENTREQUEST_0_AMT value=19.95>
        <input type=hidden name=RETURNURL value=http://localhost:8080/PaypalTest/confirm.html>
        <input type=hidden name=CANCELURL value=http://localhost:8080/PaypalTest/cancel.html>
        <input type=submit name=METHOD value=SetExpressCheckout>
    </form>
  </body>
</html>

Gruss Stefan

1 Like

Hi Stefan,
vielen Dank für die vielen ausführlichen Tipps!

Die Änderungen an oepaypalcurl.php haben leider keinen Unterschied gemacht, obwohl SSLVERSION tatsächlich noch auf 1 stand. HTTP war OK.
Der Formular-Test hat jedenfalls gezeigt, dass die Zugangsdaten nach wie vor in Ordnung sind.

Hi

setz mal in dem array den Wert

'CURLOPT_SSL_VERIFYPEER' => false,

Und versuche es nochmal

Gruss Stefan

Schade, der ist schon entsprechend gesetzt :slight_smile:

'CURLOPT_VERBOSE' => 0,
'CURLOPT_SSL_VERIFYPEER' => false,
'CURLOPT_SSL_VERIFYHOST' => false,
//'CURLOPT_SSLVERSION'     => 1,
'CURLOPT_SSLVERSION'     => 6,
'CURLOPT_RETURNTRANSFER' => 1,
'CURLOPT_POST' => 1,
'CURLOPT_HTTP_VERSION' => CURL_HTTP_VERSION_1_1,

Hi,

noch ne IDee

'CURLOPT_CAINFO' => dirname(__FILE__)."/cert/api_cert_chain.crt"),

und

CURLOPT_SSL_VERIFYPEER und CURLOPT_SSL_VERIFYHOST auf TRUE

Ggfs den Pfadn CURLOPT_CAINFO komplett setzen.

Ein Kontakt bei PayPal hat mich noch darauf hingewiesen das dieses Verhalten auch auftreten kann wenn das Zertifikat veraltet ist.

Gruss Stefan

Ich habe keine .crt-Datei und keinen “cert”-Ordner gefunden, trotz rekursiver Suche im gesamten Modules-Verzeichnis. Sollte da eine sein? :thinking:

Es gibt aber in den conf-Dateien für den vHost, also in der Struktur weit darüber, irgendwo einen Ordner SSL, darin ist u.a. eine .crt-Datei. Ich hab es mal mit dem absoluten Pfad darauf versucht:

'CURLOPT_CAINFO' => "srv/www/xxxxxx/conf/ssl/www_xxxxxx_co_uk.crt"

Das brachte leider auch keinen Erfolg