问题
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!
回答1:
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.
来源:https://stackoverflow.com/questions/9157837/could-not-find-any-usable-binding-services-in-wsdl