PHP SOAP - ich komm lokal nicht raus!

N

nightcoding

Aktives Mitglied
Thread Starter
Dabei seit
31.03.2008
Beiträge
1.104
Reaktionspunkte
65
Hi Leute,

ich hab hier ein Problem und weiß nicht, woran es liegt. Ich muss einen Webservice ansprechen und habe mir lokal alles eingerichtet. Nur ich komm einfach nicht raus, die Verbindung klappt nicht. Schiebe ich es auf einen meiner Server funktioniert es ohne Probleme, keine Fehlermeldung und Antwort von der Gegenstelle. Ruf ich die WSDL im Browser auf funktioniert es auch.

Es muss an irgendeiner PHP Einstellung liegen, nur ich weiß nicht an welcher. allow_url_fopen ist aktiviert, Firewall ist deaktiviert. Seltsam ist auch, dass ich mit cURL nichtmal eine einfache GET-Abfrage setzen kann ohne einen Timeout zu bekommen. Irgendwas scheint also die Kommunikation zu unterbinden, aber was? Hat jemand einen Tip woran es liegen könnte?

Danke und viele Grüße
Martin
 
Also ein einfache curl-Aufruf gegen z.B. http://www.heise.de geht auch nicht ?

Das einfachste zuerst checken....
Du bist sicher, das curl bei Dir lokal installiert ist ? ;-)

Wenn ja, was passiert, wenn Du per wget aus dem Terminal heraus einen HTTP-Aufruf machst ?

Von curl mal ab.
Bei Dir lokal steht Soap Client und Soap Server auf enabled (mal mit phpinfo() überprüfen) ?
 
Zuletzt bearbeitet:
Also ein einfache curl-Aufruf gegen z.B. http://www.heise.de geht auch nicht ?

Das einfachste zuerst checken....
Du bist sicher, das curl bei Dir lokal installiert ist ? ;-)

Wenn ja, was passiert, wenn Du per wget aus dem Terminal heraus einen HTTP-Aufruf machst ?

Hi,

da ich grad immernoch rumprobiere und langsam am verzweifeln bin, kommt die prompte Antwort ;)

wget hab ich nicht installiert, aber cURL im Terminal funktioniert ohne Probleme. cURL funktioniert mittlerweile auch in PHP, zumindest ein einfacher Aufruf. Was sehr seltsam ist: ich hab mir schnell eine Ubuntu VM aufgezogen und es dort getestet, da gehts ohne Probleme, sowohl mit cURL als auch über SOAP direkt (wobei SOAP jetzt sowieso wegfällt, da es einen Bug hat...).

Das Einzige, was ich mir noch vorstellen kann, ist, dass es mit SSL zusammenhängt. Aber auch cURL auf eine https:// Seite funktioniert soweit, nur eben bei diesem Webservice nicht.
 
Hi,

also nach langem Testen folgendes Ergebnis:

1. In virtueller Maschine, die lokal läuft, erfolgt die SOAP-Anfrage binnen weniger Sekunden. Keine Fehler.

2. Auf dem Testserver des Providers erfolgt die SOAP-Anfrage ebenfalls binnen weniger Sekunden. Keine Fehler.

3. Lokal auf dem Mac funktioniert die SOAP-Anfrage. Allerdings dauert der Aufruf mehrere Minuten. Erst nachdem ich den Connection-Timeout auf 5 Minuten gesetzt habe, bekomme ich die gleiche Meldung wie in 1. und 2. Sehr seltsam.

4. Mit cURL das gleiche. In virtueller Maschine und auf dem Testsekunden binnen weniger Sekunden, lokal auf dem Mac dauerts ewig.

Nun, was schließe ich daraus? An meinem Netzwerk kann es nicht liegen, da sonst auch die VM ewig brauchen würde. Ich tippe also auf eine Konfiguration von PHP. Doch auch hier Fehlanzeige, wenn ich die gleichen Einstellungen wie auf den Servern verwende, ergibt sich keine Verbesserung.

Irgendein Tipp woran es liegen könnte?

Danke & viele Grüße
Martin
 
Kannst Du mal den Code posten, den Du für Deinen php-curl Test benutzt hast ?

Ich bin neugierig und würde das gerne mal selber bei mir probieren.

Du schreibst, das die Anfrage in der VM und auf dem Server ein paar Sekunden dauert.
Ist das nicht auch schon recht viel ?

Eine konkrete Idee habe ich grade auch nicht, würde mir das aber gerne mal ausprobieren.

Eventuell irgendwas mit DNS ?
 
Du schreibst, das die Anfrage in der VM und auf dem Server ein paar Sekunden dauert.
Ist das nicht auch schon recht viel ?

Maximal 2 - 3 Sekunden und da der Zugriff auf das Testsystem erfolgt, denke ich, dass das schon in Ordnung ist. Ich poste den Code hier mal rein, wird dir aber wenig nützen, da du die SSL-Zertifikate und Zugangsdaten benötigst und die kann ich leider nicht rausgeben.

PHP:
<?php

error_reporting(E_ALL);
ini_set('display_errors', 1);

  $body = <<< EOF
<?xml version="1.0" encoding="UTF-8"?>
	<SOAP-ENV:Envelope
	xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
	<SOAP-ENV:Header />
	<SOAP-ENV:Body>
	<ipgapi:IPGApiOrderRequest
	xmlns:v1="http://ipg-online.com/ipgapi/schemas/v1"
	xmlns:ipgapi="http://ipg-online.com/ipgapi/schemas/ipgapi">
	<v1:Transaction>
	<v1:CreditCardTxType>
	<v1:Type>sale</v1:Type>
	</v1:CreditCardTxType>
	<v1:CreditCardData>
	<v1:CardNumber>
	4111111111111111
	</v1:CardNumber>
	<v1:ExpMonth>12</v1:ExpMonth>
	<v1:ExpYear>07</v1:ExpYear>
	37
	</v1:CreditCardData>
	<v1:Payment>
	<v1:ChargeTotal>19.00</v1:ChargeTotal>
	<v1:Currency>978</v1:Currency>
	</v1:Payment>
	</v1:Transaction>
	</ipgapi:IPGApiOrderRequest>
	</SOAP-ENV:Body>
	</SOAP-ENV:Envelope>
EOF;
  // initializing cURL with the IPG API URL:
  $ch = curl_init($SOAP_URL);
  // setting the request type to POST:
  curl_setopt($ch, CURLOPT_POST, 1);
  // setting the content type:
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
  // setting the authorization method to BASIC:
  curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
  // supplying your credentials:
  curl_setopt($ch, CURLOPT_USERPWD, $LOGIN.":".$PASS);
  // filling the request body with your SOAP message:
  curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
  // telling cURL to verify the server certificate:
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
  // setting the path where cURL can find the certificate to verify the
  // received server certificate against:
  curl_setopt($ch, CURLOPT_CAINFO, $SERVER_CERTIFICATE);
  // setting the path where cURL can find the client certificate:
  curl_setopt($ch, CURLOPT_SSLCERT, $CLIENT_CERTIFICATE);
  // setting the path where cURL can find the client certificate’s
  // private key:
  curl_setopt($ch, CURLOPT_SSLKEY, $CLIENT_CERTIFICATE_KEY);
  // setting the key password:
  curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $PASSPHRASE);
  curl_setopt($ch, CURLOPT_SSLVERSION, 3);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  // calling cURL and saving the SOAP response message in a variable which
  // contains a string like "<SOAP-ENV:Envelope ...>...</SOAP-ENV:Envelope>":
  $result = curl_exec($ch);

  echo curl_error($ch) == "" ? $result : curl_error($ch);

  curl_close($ch);
?>

Viele Grüße,
Martin


P.S.: DNS denke ich nicht, dann müsste die VM das gleiche Problem haben, benutzen beide den Router als DNS Server.
 
Hast Du irgend welche Aufpasser-Software wie little snitch installiert?
Ansonsten wundere ich mich etwas, weil man weder die Domain
http://www.ipg-online.com/
noch
http://ipg-online.com/

aufrufen kann.


EDIT:
kann es sein, dass Du mit httpS zugreifen solltest? Versucht man das, wird man wenigstens nach einem Zertifikat gefragt.
 
Hast Du irgend welche Aufpasser-Software wie little snitch installiert?
Ansonsten wundere ich mich etwas, weil man weder die Domain
http://www.ipg-online.com/
noch
http://ipg-online.com/

aufrufen kann.


EDIT:
kann es sein, dass Du mit httpS zugreifen solltest? Versucht man das, wird man wenigstens nach einem Zertifikat gefragt.

Hi,

dass du weder www.ipg-online.com noch ipg-online.com erreichen kannst ist normal. Der Zugriff erfolgt ausschließlich über HTTPS und nur unter https://test.ipg-online.com. Software ähnlich LittleSnitch läuft nicht. Ich werde das ganze jetzt mal mit cURL von der Befehlszeile aus testen, evtl. kann ich so den Fehler eingrenzen.
 
In Deinem Aufruf steht aber nichts von https. Ich bin nicht der soap-crack ... aber stimmt der Aufruf?
 
In Deinem Aufruf steht aber nichts von https.

Ich muss dich leider enttäuschen, die SOAP_URL lautet https://test.ipg-online.de/services ;) Der Aufruf erfolgt auch per SSL, daran liegt es nicht.

Ich konnte das Problem lösen: es liegt am L und nicht am K! :D Mein Testserver und die VM hatte beide die OpenSSL Version 0.9.8k im Einsatz. Hier am Mac ist es bedingt durch Macports 0.9.8l. So, diese Version deaktiviert und 0.9.8k aktiviert und ich konnte ohne Probleme von der Shell und cURL drauf zugreifen. Aufgefallen ist es mir, als ich es mit cURL von der Konsole getestet habe mit dem --verbose Parameter und es hing am TLS Handshake. Dieser dauerte komischerweise extrem lange. Ich hab dann auch die PHP-Erweiterung deinstalliert und mit 0.9.8k neu installiert, seitdem läufts auch mit PHP.

Ich bin nicht der soap-crack... aber stimmt der Aufruf?

Macht nix, ich auch nicht :D

Das kann ich dir nicht sagen, ich hab den Aufruf aus dem Integrationsleitfaden vom Anbieter rauskopiert und mich noch nicht um die Details gekümmert. Da ich jetzt aber eine SOAP-Fault Antwort erhalte, glaube ich nicht, dass der Aufruf stimmt :D


Danke euch beiden und viele Grüße
Martin
 
Mmmh, schade.
Ich dachte Du hättest ein neutrales Testbeispiel zur Ansicht gehabt.
Solche Probleme liebe ich ja als Kniffelaufgabe und zum rumspielen. ;)

Aber ich habe das richtig verstanden, das Du den PHP-eigenen SoapClient nicht benutzt, weil es einen Bug mit https gibt ?

Deswegen dann curl ?
 
Mmmh, schade.
Ich dachte Du hättest ein neutrales Testbeispiel zur Ansicht gehabt.
Solche Probleme liebe ich ja als Kniffelaufgabe und zum rumspielen. ;)

Aber ich habe das richtig verstanden, das Du den PHP-eigenen SoapClient nicht benutzt, weil es einen Bug mit https gibt ?

Deswegen dann curl ?

Ich liebe solche Probleme ja auch, aber meistens erst dann, wenn ich sie gelöst habe :D

Und nein, ich kann den SOAP Client auf Grund folgenden Bugs nicht verwenden: http://bugs.php.net/bug.php?id=45282

Da das WSDL von ipg-online.com leider auch Namespaces nutzt, kann ich den PHP-eigenen Soap-Client nicht verwenden. Aber vielleicht greife ich auf nuSoap zurück, das ja auf cURL aufbaut.

Viele Grüße
Martin

P.S.: Sogar der Anbieter rät cURL zu nutzen.
 
Zurück
Oben Unten