Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Could not find any usable binding services in WSDL

Tags:

php

wsdl

I'm trying to serve SOAP requests (QIWI payment system) with Kohana and PHP's SoapServer() class.

So I'm getting PHP Fatal error saying "SOAP-ERROR: Parsing WSDL: Could not find any usable binding services in WSDL."

my serving script is:

$s = new SoapServer(DOCROOT.'wsdls/IShopClientWS.wsdl');

My WSDL file is in http://mysite.url/wsdls/IShopClientWS.wsdl

It's content is:

        <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="IShopClientWSService" targetNamespace="http://client.ishop.mw.ru/" xmlns:tns="http://client.ishop.mw.ru/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://client.ishop.mw.ru/" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://client.ishop.mw.ru/">
    <xs:element name="updateBill" type="tns:updateBill"/>
    <xs:element name="updateBillResponse" type="tns:updateBillResponse"/>
    <xs:complexType name="updateBill">
        <xs:sequence>
            <xs:element minOccurs="0" name="login" type="xs:string"/>
            <xs:element minOccurs="0" name="password" type="xs:string"/>
            <xs:element minOccurs="0" name="txn" type="xs:string"/>
            <xs:element name="status" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="updateBillResponse">
        <xs:sequence>
            <xs:element name="updateBillResult" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="updateBillExt" type="tns:updateBillExt"/>
    <xs:element name="updateBillExtResponse" type="tns:updateBillExtResponse"/>

    <xs:complexType name="Param">
        <xs:sequence>
            <xs:element name="name" nillable="false" type="xsd:string"/>
            <xs:element name="value" nillable="false" type="xsd:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="ArrayOfParams">
        <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="item" type="tns:Param"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="updateBillExt">
        <xs:sequence>
            <xs:element minOccurs="0" name="login" type="xs:string"/>
            <xs:element minOccurs="0" name="password" type="xs:string"/>
            <xs:element minOccurs="0" name="txn" type="xs:string"/>
            <xs:element name="status" type="xs:int"/>
        <xs:element name="params" nillable="false" type="tns:ArrayOfParams"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="updateBillExtResponse">
        <xs:sequence>
            <xs:element name="updateBillExtResult" type="xs:int"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="updateBillResponse">
    <wsdl:part name="parameters" element="tns:updateBillResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="updateBill">
    <wsdl:part name="parameters" element="tns:updateBill">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="updateBillExtResponse">
    <wsdl:part name="parameters" element="tns:updateBillExtResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="updateBillExt">
    <wsdl:part name="parameters" element="tns:updateBillExt">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IShopClientWS">
    <wsdl:operation name="updateBill">
      <wsdl:input name="updateBill" message="tns:updateBill">
    </wsdl:input>
      <wsdl:output name="updateBillResponse" message="tns:updateBillResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="updateBillExt">
      <wsdl:input name="updateBillExt" message="tns:updateBillExt">
    </wsdl:input>
      <wsdl:output name="updateBillExtResponse" message="tns:updateBillExtResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="IShopClientWSBinding" type="tns:IShopClientWS">
    <soap12:binding style="document" transport="http://www.w3.org/2003/05/soap/bindings/HTTP/"/>
    <wsdl:operation name="updateBill">
      <soap12:operation soapAction="updateBill" style="document"></soap12:operation>
      <wsdl:input name="updateBill">
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="updateBillResponse">
        <soap12:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="updateBillExt">
      <soap12:operation soapAction="updateBillExt" style="document"/>
      <wsdl:input name="updateBillExt">
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="updateBillExtResponse">
        <soap12:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="IShopClientWSServiceService">
    <wsdl:port name="IShopClientWSPort" binding="tns:IShopClientWSBinding">
      <soap12:address location="https://mysite.url/path_to_serving_script"></soap12:address>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Due to PHP-SOAP source files at http://lxr.sweon.net/php/http/source/ext/soap/php_sdl.c:

if (ctx.sdl->bindings == NULL || ctx.sdl->bindings->nNumOfElements == 0) {
                 soap_error0(E_ERROR, "Parsing WSDL: Could not find any usable binding services in WSDL.");
}

So, what's wrong with my WSDL file?

Would be very gratefull for any help!

like image 553
s.webbandit Avatar asked Oct 08 '22 19:10

s.webbandit


1 Answers

At a glance, I would say SOAP 1.2 is not SOAP 1.1 (PHP's default). For 1.2 services, use:

$s = new SoapServer(DOCROOT.'wsdls/IShopClientWS.wsdl', 
        array('soap_version' => SOAP_1_2));

Also, transport should be "http://schemas.xmlsoap.org/soap/http" AFAIK, not http://www.w3.org/2003/05/soap/bindings/HTTP/.

<soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

To be honest, I do not strictly know why, just that it is in my wsdl's and it just works. If anyone is masochistic enough to delve in the specs feel free to link to the relevant portion.

Here is some differencies between 1.1 and 1.2 specs: http://schemas.xmlsoap.org/wsdl/soap12/soap12WSDL.htm And there is no transport like http://www.w3.org/2003/05/soap/bindings/HTTP/ So my thoughts that this is just QIWI payment system bug.

like image 87
Wrikken Avatar answered Oct 12 '22 12:10

Wrikken