[英]How do I make a secure connection to a CXF service using php?
我正在嘗試使SOAP客戶端運行,從服務提供商處獲得的唯一示例是Java,但是我需要使用PHP來完成此操作。 我對Zend並不陌生,但是對使用SOAP並不陌生。
我認為主機服務正在使用Apache CXF。
我正在這樣使用它(如下),並不斷獲取和異常“未提供用戶名”
$wsdlprice = '/home/rob/var/www/catalog-pim/public/wsdl-docs/PriceAvailabilityService_V02.wsdl';
$client = new Zend_Soap_Client($wsdlprice, array('encoding' => 'UTF-8', 'compression' => SOAP_COMPRESSION_ACCEPT));
$client->setOptions(array('login' => 'my-username', 'password' => 'my-password'));
print_r($client);
try {
$client->getPriceAvailability(array('hideZeroInv' => '0'));
}
catch (SoapFault $exception) {
echo '<br /><br /><br />EXCEPTION=' . $exception;
}
我得到的錯誤:
EXCEPTION=SoapFault exception: [soap:000101] Username is not provided in /home/rob/var/www/catalog-pim/library/Zend/Soap/Client.php:1121 Stack trace: #0 /home/rob/var/www/catalog-pim/library/Zend/Soap/Client.php(1121): SoapClient->__soapCall('getPriceAvailab...', Array, NULL, NULL, Array)
我在1121行看了Zend的'Client.php',它是肥皂的'__call'方法。 因此,可能是PHP肥皂科學不喜歡的任何事情。...就像沒有“用戶名”一樣
我一直試圖將'username'或'Username'添加到$ client中,我嘗試將其添加到'getPriceAvailability()'方法中。 我想我需要將其放在請求標頭中,但我也無法弄清楚。 我試圖弄亂$client->addSoapInputHeader(new SoapHeader::$header);
但是我不知道在$ header中放入什么,而且我似乎在網上找不到很多東西。
WSDL文檔:
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="PriceAvailabilityServiceV02" targetNamespace="http://pnaV02.model.ws.synnex.com/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://pnaV02.model.ws.synnex.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsp:Policy xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UTOverTransport">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Lax/>
</wsp:Policy>
</sp:Layout>
<sp:IncludeTimestamp/>
</wsp:Policy>
</sp:TransportBinding>
<sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient"/>
</wsp:Policy>
</sp:SignedSupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://pnaV02.model.ws.synnex.com/" xmlns:tns="http://pnaV02.model.ws.synnex.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="getPriceAvailability" type="tns:getPriceAvailability" />
<xs:element name="getPriceAvailabilityResponse" type="tns:getPriceAvailabilityResponse" />
<xs:complexType name="getPriceAvailability">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="skuList" type="tns:skuList" />
<xs:element maxOccurs="unbounded" minOccurs="0" name="warehouse" type="tns:warehouse" />
<xs:element name="hideZeroInv" type="xs:boolean" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="skuList">
<xs:sequence>
<xs:element minOccurs="0" name="synnexSku" type="xs:int" />
<xs:element minOccurs="0" name="specialPriceType" type="tns:specialPriceType" />
<xs:element minOccurs="0" name="mfgPartNumber" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="getPriceAvailabilityResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:pnaResponse" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="pnaResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="priceAvailabilityList" type="tns:pnaDetail" />
<xs:element name="errorMessage" type="xs:string" />
<xs:element name="errorDetail" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="pnaDetail">
<xs:sequence>
<xs:element name="synnexSku" type="xs:int" />
<xs:element name="mfgPartNumber" type="xs:string" />
<xs:element name="mfgCode" type="xs:int" />
<xs:element name="status" type="tns:pnaPartStatus" />
<xs:element name="shortDescription" type="xs:string" />
<xs:element name="globalProductStatusCode" type="tns:pnaPartStatus" />
<xs:element name="resellerPrice" type="xs:double" />
<xs:element name="totalQuantity" type="xs:int" />
<xs:element name="totalOnOrder" type="xs:int" />
<xs:element name="totalBO" type="xs:int" />
<xs:element maxOccurs="unbounded" name="availabilityByWarehouseList" type="tns:availabilityByWarehouse" />
<xs:element name="lineNumber" type="xs:int" />
<xs:element minOccurs="0" name="specialPriceType" type="tns:specialPriceType" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="availabilityByWarehouse">
<xs:sequence>
<xs:element name="warehouseInfo" type="tns:warehouseInfo" />
<xs:element name="quantity" type="xs:int" />
<xs:element maxOccurs="unbounded" minOccurs="0" name="ETAList" type="tns:availETA" />
<xs:element name="OnOrder" type="xs:int" />
<xs:element name="BO" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="warehouseInfo">
<xs:sequence>
<xs:element name="warehouse" type="tns:warehouse" />
<xs:element name="zipCode" type="xs:string" />
<xs:element name="city" type="xs:string" />
<xs:element name="address" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="availETA">
<xs:sequence>
<xs:element minOccurs="0" name="ETA" type="xs:string" />
<xs:element name="QTY" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:simpleType name="specialPriceType">
<xs:restriction base="xs:string">
<xs:enumeration value="PROMOTION" />
<xs:enumeration value="FEDERALGOVERNMENT" />
<xs:enumeration value="STATEGOVERNMENT" />
<xs:enumeration value="EDUCATION" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="warehouse">
<xs:restriction base="xs:string">
<xs:enumeration value="ANY" />
<xs:enumeration value="CLOSEST" />
<xs:enumeration value="MULTIPLE" />
<xs:enumeration value="DNV" />
<xs:enumeration value="DFR" />
<xs:enumeration value="DAT" />
<xs:enumeration value="DTX" />
<xs:enumeration value="DCH" />
<xs:enumeration value="DTN" />
<xs:enumeration value="DNJ" />
<xs:enumeration value="DDC" />
<xs:enumeration value="DOR" />
<xs:enumeration value="DLA" />
<xs:enumeration value="DCC" />
<xs:enumeration value="DOH" />
<xs:enumeration value="DFL" />
<xs:enumeration value="DDS" />
<xs:enumeration value="UNKNOWN" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="pnaPartStatus">
<xs:restriction base="xs:string">
<xs:enumeration value="DISCONTINUED" />
<xs:enumeration value="INACTIVE" />
<xs:enumeration value="ACTIVE" />
<xs:enumeration value="NOTAUTHORIZED" />
<xs:enumeration value="NOTSETUP" />
<xs:enumeration value="NOTFOUND" />
<xs:enumeration value="UNKNOWN" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
</wsdl:types>
<wsdl:message name="getPriceAvailability">
<wsdl:part element="tns:getPriceAvailability" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getPriceAvailabilityResponse">
<wsdl:part element="tns:getPriceAvailabilityResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="PriceAvailabilityService" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" wsp:PolicyURIs="#UTOverTransport">
<wsdl:operation name="getPriceAvailability">
<wsdl:input message="tns:getPriceAvailability" name="getPriceAvailability">
</wsdl:input>
<wsdl:output message="tns:getPriceAvailabilityResponse" name="getPriceAvailabilityResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PriceAvailabilityServiceV02SoapBinding" type="tns:PriceAvailabilityService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getPriceAvailability">
<soap:operation soapAction="" style="document" />
<wsdl:input name="getPriceAvailability">
<soap:body use="literal" />
</wsdl:input>
<wsdl:output name="getPriceAvailabilityResponse">
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PriceAvailabilityServiceV02">
<wsdl:port binding="tns:PriceAvailabilityServiceV02SoapBinding" name="PriceAvailabilityServicePort">
<soap:address location="http://ws.synnex.com/webservice/pnaserviceV02" />
</wsdl:port>
<wsdl:port binding="tns:PriceAvailabilityServiceV02SoapBinding" name="PriceAvailabilityServicePort_UAT">
<soap:address location="http://testws.synnex.com/webservice/pnaserviceV02" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
再次回答我自己的問題...(雖然還不錯)
我發現我實際上是在嘗試連接到CXF服務http://cxf.apache.org/
此特定服務使用此處概述的WS安全性: http ://www.oasis-open.org/committees/tc_home.php?wg_abbrev= wss
嘗試使用PHP連接到此類服務時,我不是唯一一個遇到此問題的人,幸運的是(對我而言)我發現了這篇文章http://sastriawan.blogspot.com/2010/01/accessing-ws- security-protected.html
上面的鏈接清楚地顯示了如何使用從Tornto大學網站獲得的類的示例,以及我在Google Code http://code.google.com/p/xmlseclibs/上找到的另一個名為“ xmlseclibs”的小型庫。
我還沒有廣泛研究“新”代碼,但是看來它可以將身份驗證放入請求的標頭中,並且對我來說還不錯。
我在博客上創建了一個類似於SoapClient的新類,並添加了自己的身份驗證憑據,現在可以連接到服務器...只收到有關方法變量缺失的投訴...我將在近期修復此問題我可以建立聯系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.