Как мне сделать безопасное соединение с сервисом CXF, используя php? - PullRequest
0 голосов
/ 25 декабря 2011

Я пытаюсь запустить клиент 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)

Я взглянул на Zend 'Client.php' в строке 1121, и это мыльный метод __call. Таким образом, может быть все, что не нравится PHP-мылу, например, отсутствие имени пользователя

Я продолжаю пытаться добавить 'username' или 'Username' к $ client, я пытался добавить его в метод 'getPriceAvailability ()'. Я думаю, что мне нужно поместить это в заголовок запроса, но я не могу понять это либо. Я пытался связываться с $client->addSoapInputHeader(new SoapHeader::$header);, но я не знаю, что поместить в заголовок $, и я не могу найти что-либо в Интернете.

WSDL doc:

<?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>

1 Ответ

0 голосов
/ 26 декабря 2011

Снова отвечаю на мой вопрос ... (хотя и не так плохо)

Я обнаружил, что на самом деле пытаюсь подключиться к службе CXF http://cxf.apache.org/

Этот конкретный сервис использует WS Security, описанную здесь: http://www.oasis -open.org / committees / tc_home.php? Wg_abbrev = wss

Я не единственный, кто столкнулся с этой проблемой при попытке подключиться к такому сервису с помощью PHP, к счастью (для меня), я нашел этот пост http://sastriawan.blogspot.com/2010/01/accessing-ws-security-protected.html

Ссылка выше ясно показывает пример использования класса, полученного с веб-сайта Университета Торнто, и другой небольшой библиотеки под названием «xmlseclibs», которую я нашел в Google Code http://code.google.com/p/xmlseclibs/

Я еще не изучал «новый» код, но, похоже, он обрабатывает вставку аутентификации в заголовок запроса и работает для меня просто отлично.

Я создал новый класс, похожий на класс в блоге, который расширяет SoapClient, и добавил свои собственные учетные данные для аутентификации, и теперь я могу подключаться к серверу ... только получаю жалобы на отсутствие переменных метода ... который я исправлю Вскоре я могу установить соединение.

...