Не удалось найти какие-либо используемые службы привязки в WSDL - PullRequest
4 голосов
/ 06 февраля 2012

Я пытаюсь обслуживать запросы SOAP (платежная система QIWI) с помощью Kohana и класса PHP SoapServer ().

Итак, я получаю фатальную ошибку PHP, сообщающую: «SOAP-ERROR: Синтаксический анализ WSDL: не удалось найти какие-либо используемые службы привязки в WSDL».

Мой сценарий сервировки:

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

Мой файл WSDL находится в http://mysite.url/wsdls/IShopClientWS.wsdl

Это содержание:

        <?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>

Из-за исходных файлов PHP-SOAP на 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.");
}

Итак, что не так с моим файлом WSDL?

Буду очень признателен за любую помощь!

1 Ответ

3 голосов
/ 08 февраля 2012

С первого взгляда я бы сказал, что SOAP 1.2 - это не SOAP 1.1 (по умолчанию в PHP). Для услуг 1.2 используйте:

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

Кроме того, транспорт должен быть "http://schemas.xmlsoap.org/soap/http" AFAIK, а не http://www.w3.org/2003/05/soap/bindings/HTTP/.

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

Если честно, я не знаю точно, почему, просто он в моих wsdl и он просто работает . Если кто-то достаточно мазохист, чтобы вникать в спецификации, не стесняйтесь ссылаться на соответствующую часть.

Вот некоторые различия между спецификациями 1.1 и 1.2: http://schemas.xmlsoap.org/wsdl/soap12/soap12WSDL.htm И нет транспорта, как http://www.w3.org/2003/05/soap/bindings/HTTP/ Поэтому я думаю, что это просто ошибка платежной системы QIWI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...