php – 在WSDL中找不到任何可用的绑定服务
我正在尝试使用Kohana和
PHP的SoapServer()类来提供SOAP请求(QIWI支付系统).
所以我收到PHP Fatal错误说“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> 由于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."); } 那么,我的WSDL文件出了什么问题? 非常感谢任何帮助! 解决方法
乍一看,我会说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支付系统的bug. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |