2011-12-25 104 views
0

我正在嘗試獲取SOAP客戶端,我從服務提供者處獲得的唯一示例是使用Java,但我需要使用PHP來執行此操作。我對Zend並不陌生,但對於使用SOAP來說是新的。如何使用php建立與CXF服務的安全連接?

我認爲主機服務正在使用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) 

我在Zend的拍了一下1121行的'Client.php',它是soap'__call'方法。所以,可能是任何PHP的肥皂不喜歡....像沒有'用戶名'

我一直試圖添加'用戶名',或'用戶名'的$客戶,我試着添加它到'getPriceAvailability()'方法。我想我需要把它放在請求標題中,但我無法弄清楚。我試着用$client->addSoapInputHeader(new SoapHeader::$header);搞亂,但我不知道要把什麼放到$ he​​ader中,我似乎無法在網上找到很多東西。

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> 

回答

0

再回答我的問題......(沒有那麼糟糕,雖然)

我發現,我其實嘗試連接到一個CXF服務http://cxf.apache.org/

這個服務使用WS安全概述在這裏:http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss

我不是唯一一個遇到這個問題時遇到mpting使用PHP連接到這樣的服務,幸運的是(對我來說)我發現這篇文章http://sastriawan.blogspot.com/2010/01/accessing-ws-security-protected.html

上面的鏈接清楚地顯示了一個如何使用從Tornto大學網站獲得的類的例子,我在Google Code上找到的'xmlseclibs'http://code.google.com/p/xmlseclibs/

我還沒有廣泛研究過'新'代碼,但它似乎處理將認證放入請求頭部,並且正在爲我工​​作。

我創建了一個新的類,類似於博客上擴展SoapClient的類,並添加了我自己的身份驗證憑據,現在可以連接到服務器...只有獲取有關方法變量丟失的投訴...我將現在可以立即修復我可以建立連接。

相關問題