Добрый день! Реализуем сервис внешней авторизации на базе SOAP (служба внешней авторизации в целевой системе работает только с SOAP). С толкнулись с такой проблемой, необходимо на запрос внешней системы в одном из методов отдать сложную структуру, ниже пример из документации целевой системы
Обращение:
Ответ:
Ни как не получается реализовать вложенность тега <meters>
В описании сервиса структуры реализованы таким образом
Подскажите где может быть ошибка, что мы не учли. Есть предположение что необходимо дополнительно описать тупы структуры, или классы с использованием $wsdesc->classTypes
Ниже примеры wsdl
Из описания сервиса
Генерируемый сервисом
Обращение:
Код |
---|
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <FindConsumer xmlns="PyramidExternalAuth"> <login>c22314056</login> </FindConsumer> </s:Body> </s:Envelope> |
Код |
---|
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <FindConsumerResponse xmlns="PyramidExternalAuth"> <FindConsumerResult i:type="NaturalPersonConsumerData" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Address>г. Владимир, ул. Лакина, д.8</Address> <ContractEndDt i:nil="true"/> <ContractNumber>22314056</ContractNumber> <ContractStartDt>2021-08-10T00:00:00+03:00</ContractStartDt> <Email>IvanovVP@cmail.ru</Email> <INN>332704207884</INN> <Meters> <MeterData> <Model i:nil="true"/> <Serial>12653469</Serial> </MeterData> </Meters> <PersonalAccount>22314056</PersonalAccount> <Phone>+79015547799</Phone> <FisrtName>Иванов</FisrtName> <LastName>Василий</LastName> <MiddleName>Павлович</MiddleName> <PassportData>1744-788488</PassportData> </FindConsumerResult> </FindConsumerResponse> </s:Body> </s:Envelope> |
В описании сервиса структуры реализованы таким образом
Код |
---|
//Типы структур $wsdesc->structTypes["MeterData"] = array( "Model" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "Serial" => array("varType" => "string", "nillable" => "true", "strict" => "no") ); $wsdesc->structTypes["NaturalPersonConsumerData"] = array( "FirstName" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "LastName" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "MidleName" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "PassportData" => array("varType" => "string", "nillable" => "true", "strict" => "no") ); $wsdesc->structTypes["LegalEntityConsumerData"] = array( "LegalEntityCaption" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "OGRNIP" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "DateEGRIP" => array("varType" => "string", "nillable" => "true", "strict" => "no") ); $wsdesc->structTypes["CustomConsumerData"] = array( "Address" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "ContractEndDt" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "ContractNumber" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "ContractStartDt" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "Email" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "INN" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "Meters" => array("varType" => "ArrayOfMeterData", "arrType" => "MeterData", "nillable" => "true", "strict" => "no"), "PersonalAccount" => array("varType" => "string", "nillable" => "true", "strict" => "no"), "Phone" => array("varType" => "string", "nillable" => "true", "strict" => "no") ); $wsdesc->classes = array( "IExternalAuthProvider" => array( "FindConsumer" => array( "type" => "public", "name" => "FindConsumer", "input" => array( "login" =>array("varType" => "string", "nillable" => "true"), ), "output" => array( "FindConsumerResult" => array("varType" => "CustomConsumerData") ) ), ) ); |
Ниже примеры wsdl
Из описания сервиса
Код |
---|
<xs:element name="FindConsumer"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="login" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="FindConsumerResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="FindConsumerResult" nillable="true" type="tns:CustomConsumerData"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="CustomConsumerData"> <xs:sequence> <xs:element minOccurs="0" name="Address" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="ContractEndDt" nillable="true" type="xs:dateTime"/> <xs:element minOccurs="0" name="ContractNumber" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="ContractStartDt" nillable="true" type="xs:dateTime"/> <xs:element minOccurs="0" name="Email" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="INN" nillable="true" type="xs:string"/> <xs:element name="Meters" nillable="true" type="tns:ArrayOfMeterData"/> <xs:element name="PersonalAccount" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="Phone" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="CustomConsumerData" nillable="true" type="tns:CustomConsumerData"/> <xs:complexType name="ArrayOfMeterData"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="MeterData" nillable="true" type="tns:MeterData"/> </xs:sequence> </xs:complexType> <xs:element name="ArrayOfMeterData" nillable="true" type="tns:ArrayOfMeterData"/> <xs:complexType name="MeterData"> <xs:sequence> <xs:element minOccurs="0" name="Model" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="Serial" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="MeterData" nillable="true" type="tns:MeterData"/> <xs:complexType name="NaturalPersonConsumerData"> <xs:complexContent mixed="false"> <xs:extension base="tns:CustomConsumerData"> <xs:sequence> <xs:element name="FisrtName" nillable="true" type="xs:string"/> <xs:element name="LastName" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="MiddleName" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="PassportData" nillable="true" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="NaturalPersonConsumerData" nillable="true" type="tns:NaturalPersonConsumerData"/> <xs:complexType name="LegalEntityConsumerData"> <xs:complexContent mixed="false"> <xs:extension base="tns:CustomConsumerData"> <xs:sequence> <xs:element minOccurs="0" name="DateEGRIP" nillable="true" type="xs:dateTime"/> <xs:element name="LegalEntityCaption" nillable="true" type="xs:string"/> <xs:element minOccurs="0" name="OGRNIP" nillable="true" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="LegalEntityConsumerData" nillable="true" type="tns:LegalEntityConsumerData"/> |
Код |
---|
<xsd:complexType name="MeterData"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Model" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Serial" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="NaturalPersonConsumerData"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="FirstName" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="LastName" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="MidleName" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="PassportData" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="LegalEntityConsumerData"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="LegalEntityCaption" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="OGRNIP" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="DateEGRIP" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="CustomConsumerData"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Address" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="ContractEndDt" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="ContractNumber" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="ContractStartDt" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Email" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="INN" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Meters" type="tns:ArrayOfMeterData"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="PersonalAccount" type="xsd:string"/> <xsd:element minOccurs="0" maxOccurs="1" nillable="true" name="Phone" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ArrayOfMeterData"> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="unbounded" name="ArrayOfMeterDataEl" type="tns:MeterData"/> </xsd:sequence> </xsd:complexType> <xsd:element name="FindConsumer"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" name="login" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="FindConsumerResponse"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="1" name="FindConsumerResult" type="tns:CustomConsumerData"/> </xsd:sequence> </xsd:complexType> </xsd:element> |