我正在尝试使用 Kohana 和 PHP 的 SoapServer() 类来处理 SOAP 请求(QIWI 支付系统)。
所以我收到 PHP 致命错误,提示“SOAP-ERROR:解析 WSDL:在 WSDL 中找不到任何可用的绑定服务”。
我的服务脚本是:
$s = new SoapServer(DOCROOT.'wsdls/IShopClientWS.wsdl');
Run Code Online (Sandbox Code Playgroud)
我的 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>
Run Code Online (Sandbox Code Playgroud)
由于http://lxr.sweon.net/php/http/source/ext/soap/php_sdl.c上的 PHP-SOAP 源文件:
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.");
}
Run Code Online (Sandbox Code Playgroud)
那么,我的 WSDL 文件有什么问题?
将非常感谢任何帮助!
乍一看,我想说SOAP 1.2不是SOAP 1.1(PHP 的默认值)。对于 1.2 服务,请使用:
$s = new SoapServer(DOCROOT.'wsdls/IShopClientWS.wsdl',
array('soap_version' => SOAP_1_2));
Run Code Online (Sandbox Code Playgroud)
另外,运输应该是"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"/>
Run Code Online (Sandbox Code Playgroud)
老实说,我并不完全知道为什么,只是它在我的wsdl 中并且它可以正常工作。如果有人受虐狂到足以深入研究规格,请随意链接到相关部分。
以下是 1.1 和 1.2 规范之间的一些差异:http://schemas.xmlsoap.org/wsdl/soap12/soap12WSDL.htm
并且没有像这样的传输
http://www.w3.org/2003/05/soap/bindings/HTTP/
所以我认为这只是 QIWI 支付系统错误。