phpsoapsap-pisap-xi

PHP SOAP doesn't catch SAP PI/XI SOAP fault


I do SOAP request to SAP PI web service. This service returns SOAP fault like that:

<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP:Body>
      <SOAP:Fault>
         <faultcode>SOAP:Server</faultcode>
         <faultstring>Server Error</faultstring>
         <detail>
            <s:SystemError xmlns:s="http://sap.com/xi/WebService/xi2.0">
               <context>XIAdapter</context>
               <code>ADAPTER.JAVA_EXCEPTION</code>
               <text>com.sap.aii.af.service.cpa.CPAObjectNotFoundException: Couldn't
                       retrieve binding for the given channelId: Binding:CID=null;
               at com.sap.aii.af.service.cpa.impl.lookup.AbstractLookupManager.getBindingByChannelId(AbstractLookupManager.java:173)
               at com.sap.aii.adapter.soap.web.MessageServlet.doPost(MessageServlet.java:449)
               ...
               at com.sap.engine.core.thread.execution.CentralExecutor$SingleThread.run(CentralExecutor.java:327)</text>
            </s:SystemError>
         </detail>
      </SOAP:Fault>
   </SOAP:Body>
</SOAP:Envelope>

In PHP, I do as follows:

$client = new SoapClient('path/to/wsdl', array(
            'cache_wsdl' => WSDL_CACHE_NONE,
            'exceptions' => true,
            'login' => 'some_login',
            'password' => 'some_password',
        ));
$result = $client->some_funtion("bla-bla-bla");
var_dump($result);

It prints null, but should throw an exception.

If I output the same XML (SOAP fault) in my own web service, I catch it correctly.


Solution

  • The problem was in output tag in WSDL. I have added this tag and it solve my problem

    <wsdl:portType name="...">
         <wsdl:operation name="...">
             ...
             <wsdl:input message="..."/>
             <wsdl:output message="..."/> <!--- that tag-->
         </wsdl:operation>
    </wsdl:portType>