2013-05-29 18 views
10

Próbuję wdrożyć usługę sieci Web działającą w systemie SAP PI. WSDL mam wygląda następująco:PHP SoapClient: Nie jest wymagane wymagane rozszerzenie WSDL

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions name="request_SO" targetNamespace="http://company.ch/orstest/jason_test" xmlns:p1="http://company.ch/orstest/jason_test" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:documentation/> 
    <wsp:UsingPolicy wsdl:required="true"/> 
    <wsp:Policy wsu:Id="OP_request_SO"/> 
    <wsdl:types> 
     <xsd:schema targetNamespace="http://company.ch/orstest/jason_test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://company.ch/orstest/jason_test"> 
      <xsd:element name="request" type="request"/> 
      <xsd:element name="response" type="response"/> 
      <xsd:complexType name="request"> 
       <xsd:annotation> 
        <xsd:appinfo source="http://sap.com/xi/VersionID">a8b7948ac2e211e2b2380000001f0d6a</xsd:appinfo> 
       </xsd:annotation> 
       <xsd:sequence> 
        <xsd:element name="body" type="xsd:string"/> 
       </xsd:sequence> 
      </xsd:complexType> 
      <xsd:complexType name="response"> 
       <xsd:annotation> 
        <xsd:appinfo source="http://sap.com/xi/VersionID">bf49af09c36c11e299790000001f0d6a</xsd:appinfo> 
       </xsd:annotation> 
       <xsd:sequence> 
        <xsd:element name="body" type="xsd:string"/> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="request"> 
     <wsdl:documentation/> 
     <wsdl:part name="request" element="p1:request"/> 
    </wsdl:message> 
    <wsdl:message name="response"> 
     <wsdl:documentation/> 
     <wsdl:part name="response" element="p1:response"/> 
    </wsdl:message> 
    <wsdl:portType name="request_SO"> 
     <wsdl:documentation/> 
     <wsdl:operation name="request_SO"> 
      <wsdl:documentation/> 
      <wsp:Policy> 
       <wsp:PolicyReference URI="#OP_request_SO"/> 
      </wsp:Policy> 
      <wsdl:input message="p1:request"/> 
      <wsdl:output message="p1:response"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="request_SOBinding" type="p1:request_SO"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     <wsdl:operation name="request_SO"> 
      <soap:operation soapAction="http://sap.com/xi/WebService/soap1.1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      <wsdl:input> 
       <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="request_SOService"> 
     <wsdl:port name="HTTP_Port" binding="p1:request_SOBinding"> 
      <soap:address location="http://qa1100ap601.company.car.web:50000/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     </wsdl:port> 
     <wsdl:port name="HTTPS_Port" binding="p1:request_SOBinding"> 
      <soap:address location="https://qas.soa.subcompany.company.ch/XISOAPAdapter/MessageServlet?senderParty=&amp;senderService=BS_ORS&amp;receiverParty=&amp;receiverService=&amp;interface=request_SO&amp;interfaceNamespace=http://company.ch/orstest/jason_test" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Mój plik PHP wygląda następująco (nic więcej w tej chwili):

<?php 
$client = new SoapClient('test.wsdl'); 
?> 

Kiedy biegnę mój skrypt, pojawia się następujący błąd wrzucony :

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unknown required WSDL extension 'http://schemas.xmlsoap.org/ws/2004/09/policy' in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2 

Próbowałem szukając błędów w Google i StackOverflow, a także sprawdzone komentarze na php.net, ale nie wydają się dowiedzieć co musiałbym zmienić w celu uzyskania tego Usługa działa. Próbowałem również otworzyć adres URL rozszerzenia WSDL, wydaje się, że istnieje.

Czy ktoś może rzucić mi tutaj kość? Próbowałem usuwania URL przedłużacza, że ​​wyniki w następujący błąd:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Unexpected WSDL element <UsingPolicy> in /srv/www/htdocs/wsdl.php:2 Stack trace: #0 /srv/www/htdocs/wsdl.php(2): SoapClient->SoapClient('test.wsdl') #1 {main} thrown in /srv/www/htdocs/wsdl.php on line 2 

Odpowiedz

16

Jedynym rozwiązaniem można myślę w tym momencie jest aktualizacja tag UsingPolicy:

Zmień tag:

<wsp:UsingPolicy wsdl:required="true"/> 

do tego:

<wsp:UsingPolicy wsdl:required="false"/> 
+2

Hej super, błąd już nie istnieje :) Teraz mogę wypróbować usługę :) – Ahatius

+0

Awesome! Glad to help. –

14

to naprawdę nie jest poprawna odpowiedź w środowisku SAP. W adresie URL WSDL zobaczysz /ws_policy/ - zmienisz go na /standard/, a będziesz mógł używać klasy PHP SoapClient do korzystania z usługi internetowej bez konieczności utrzymywania lokalnej zmodyfikowanej kopii WSDL. Możesz zobaczyć to samo na blogu SAP here (prawdopodobnie wymagane logowanie).

+0

Miałem dokładnie ten problem z serwisem SAP, a Twoja odpowiedź uratowała mi dzień! – Shmarkus

3

For new versions the URL is not containing anymore the "ws_policy" instead there is a 0 (standard)or 1 (policy)

Example:

....wsdl/flv_10002A111AD1/bndg_url/.... (ws_policy)

....wsdl/flv_10002A101AD1/bndg_url/.... (standard)

kuponów do Rafa Martinez

+0

Dzięki za wspaniałą odpowiedź! Uratowałeś mi godziny! – Sonson123

0

Wydaje się być to błąd w PHP SOAPServer lub brakuje kompatybilności rozszerzeń, a nie został jeszcze rozwiązany, przynajmniej w PHP 5.6.31.

Jedynym rozwiązaniem udało mi się znaleźć, było ustalenie wymagane UsingPolicy do false, jak zasugerowano w przyjętym odpowiedzi:

<wsp:UsingPolicy wsdl:required="false" /> 

Ale klienci mogą uzyskać dostęp do usługi SOAP bez uwierzytelniania, który jest poważnym problemem bezpieczeństwa. Tak więc, próbowałem ręcznie sprawdzić, czy dane bezpieczeństwa są wysyłane przez klienta.

$soapEnvelope = new DOMDocument(); 
$soapEnvelope->loadXML(file_get_contents("php://input"), LIBXML_DTDATTR); 
$wsseNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Security')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing wsse:Security node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'UsernameToken')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing UsernameToken node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Username')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing Username node'); 
} 

if ($soapEnvelope->getElementsByTagNameNS($wsseNamespace, 'Password')->length == 0) { 
    throw new SoapFault("auth", 'Authentication error - Missing Password node'); 
} 

// SOAPServer handle requests method 
$server->handle(); 

To sztuczka z brudem, ale działa.