Uncaught SoapFault exception ohne Begründung bei einfachem Logon

Blue Effect

Mitglied
Hallo,

ich versuche eine ganz kleine, einfache Schnittstelle zu affili.net aufzubauen. Ich habe nur einen vorgegebenen fertigen Code 1:1 kopiert:
PHP:
define ("WSDL_LOGON", "https://developer-api.affili.net/V2.0/Logon.svc?wsdl");
define ("WSDL_STATS",  "https://developer-api.affili.net/V2.0/PublisherStatistics.svc?wsdl");

$Username   = '';     // your developer ID
$Password   = '';     // your developer portal password
$DemoPublisherId   = 403233;  // one of the publisher IDs of our demo database
$DeveloperSettings = array('SandboxPublisherID' => $DemoPublisherId);

$SOAP_LOGON = new SoapClient(WSDL_LOGON);
$Token      = $SOAP_LOGON->Logon(array(
                     'Username'  => $Username,
                     'Password'  => $Password,
                     'WebServiceType' => 'Publisher',
                     'DeveloperSettings' => $DeveloperSettings,
                     'trace'=>1
                     ));
Bei mir kommt, lokal unter PHP5.3.0 und xampp, nur eine Fehlermeldung:
Fatal error: Uncaught SoapFault exception: [s:Client] The creator of this fault did not specify a Reason. in ...script.php:40 Stack trace: #0 [...]

Was bedeutet das? Beim Suchen bin ich nur auf eine Möglichkeit gestoßen den Fehler zu finden:
PHP:
is_soap_fault($Token) {...
Aber da geht er gar nicht rein.

Akzeptiert meine Testumgebung vielleicht keine https-Verbindungen?
 
Du solltest die komplette Soap Kommunikation immer mit try und catch behandeln. Um auf alle möglichen Fehler reagieren zu können. trace im Verbindungsaufbau mit anzugeben gibt dir die Möglichkeit noch etwas genauer hinschauen zu können warum die Kommunikation denn fehlgeschlagen ist.

PHP:
try {
	$SOAP_LOGON = new SoapClient(WSDL_LOGON, array('trace' => 1)); 
	$Token  = $SOAP_LOGON->Logon(array( 
                     'Username'  => $Username, 
                     'Password'  => $Password, 
                     'WebServiceType' => 'Publisher', 
                     'DeveloperSettings' => $DeveloperSettings, 
                     'trace'=>1 
                     ));  
} catch(SoapFault $e) {
	echo "Request :\n". ($SOAP_LOGON->__getLastRequest()). "\n";
	echo "Response :\n". ($SOAP_LOGON->__getLastResponseHeaders()). "\n";
	echo "Response :\n". ($SOAP_LOGON->__getLastResponse()). "\n";
	echo($e->getMessage());
} catch(Exception $e) {
	echo $e->getMessage();
}
 
The creator of this fault did not specify a Reason.
Das klingt nach einem per Hand geschmissenem SoapFault ohne faultstring.

Probier mal
PHP:
$SOAP_LOGON = new SoapClient(WSDL_LOGON,array(
"exceptions" => false);
Mit dieser Option wird bei einem Fehler keine Exception geschmissen sondern ein SoapFault-Objekt zurückgegeben. Sprich deine Variable $Token wäre dann ein Objekt vom Typ SoapFault und genau das könntest du mit der Methode is_soap_fault() überprüfen.
Viel bringen würde dir das aber nicht, weil du dadurch nur die selben Informationen in einer Variablen hättest, die du auch schon vorher als Uncaught-Exception-Text bekommst.

Ich hab mir jetzt gerade mal den Link angesehen und auch schon was verdächtiges gesehen, und zwar das
PHP:
'trace'=>1
beim aufruf der Logon-Methode.
Ich vermute, du wolltest das haben, um die Response's und Requests nachverfolgen zu können:
PHP:
$SOAP_LOGON = new SoapClient(WSDL_LOGON,array(
"exceptions" => false, //Kann auch weggelassen werden
"trace" => 1);
Und natürlich das trace bei der Logon-Methode weglassen.
 
Hey super, danke. Auf das try catch bin ich nicht gekommen, das hat mir etwas weitergeholfen. Auch das trace bringe ich jetzt richtig unter.

Ich weiß jetzt dass das Login fehlschlug.
Der zeigt mir erst den Header an und dann
Response : s:Client1090000035|Login failed.1090000035Login failed. 1090000035|Login failed.
Das ist aber keine PHP-Meldung mehr, sondern die Logik des angesprochenen, also affili, richtig?
 
Mit set_error_handler kannst du auch nicht Exceptions (also normale Errors) als Exceptions handeln und sauber in den Trace nehmen
http://wiki.yaslaw.info/wikka/PhpErrorsAsExceptions

PHP:
function exceptionErrorHandler($errno, $errstr, $errfile, $errline ) {
    if($errno & ini_get('error_reporting')) {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }
}
set_error_handler("exceptionErrorHandler");

try{
    //TODO dein Code
} catch(Exception $e){
    echo "<b>".$e->getMessage()."</b><br />\n";
    echo nl2br($e->getTraceAsString());
}
 

Neue Beiträge

Zurück