С чем? С этим? Все проблемы заключаются исключительно в нашем незнании. Сама технология проста. И никакой она не epic fail. Поконкретнее? О чем написать? В обычных случаях и стандартных примерах все работает. Проблемы начинаются при интеграции с сервисами Java/C#, там используются более мощные библиотеки чем в PHP. И соотвественно часто используются сложные (complex) типы. Основная сложность в том, чтобы понять как объяснить PHP, что нужно создать примерно вот такой xml HTML: <request> <soapMethod> <param name="param1" type="methodParam"> <property1 property2="value2"> <value>value1</value> </property1> </param> </soapMethod> </request> Потому что он норовит создать вот такой HTML: <request> <soapMethod> <param name="param1" type="methodParam"> <property1> <value>value1</value> </property1> <property2> <value>value2</value> </property2> </param> </soapMethod> </request> Пример конечно упрощен но для сути - достаточно. И поскольку я так и нерешил этот вопрос окончательно то и мануала писать не о чем Попадется похожая задача, разберусь как это работает, тогда может и напишу
Я так и решил когда-то - но это некузявый метод за который мне стыдно В простейшем примере как я привел, мне удалось разобраться В более сложных вариантах с 4-5 уровнями вложенности типов - не сложилось Тем не менее генерировать xml ручками - это неправильно. Иначе весь смысл технологии пропадает
почему то когда отправляю запрос PHP: $param=array ("paymentSystem"=>'test', "contractCode"=>'57971', "service"=>'bb', "CreateDate"=>'17.02.2008'); $result = $client->checkPaymentAbility($param); htmlspecialchars($client->__getLastRequest()) возвращяет [css]<SOAP-ENV:Body><ns1:checkPaymentAbility/></SOAP-ENV:Body></SOAP-ENV:Envelope>[/css] тоесть блок <ns1:checkPaymentAbility/> не заполнен. может кто знает и подскажет из-за чего может быть так? есть краткое описанеи параметров которые необходимо пересылать: [css]Метод : checkPaymentAbility Интерфейс Свойство Пример заполнения AbilityRequest paymentSystem test contractCode 57971 service bb CreateDate 17.02.2008[/css]
вроде как получилось. запрос формируется с данными: [css]<SOAP-ENV:Body><ns2:checkPaymentAbility xsi:type="ns1:SOAPStruct"><paymentSystem>test</paymentSystem><contractCode>57971</contractCode><service>bb</service></ns2:checkPaymentAbility></SOAP-ENV:Body>[/css] но возвращает код ошибки с которого видно что ошибка в структуре. не подскажете как я могу сверить структуру и правильность ее составления?....
я понимаю что по идеи должно быть не xsi но wdsl... не поскажешь как задать? использую такой запрос: PHP: class SOAPStruct { function SOAPStruct($s, $i, $f) { $this->paymentSystem = $s; $this->contractCode = $i; $this->service = $f; } } $client = new SoapClient("https://*******/PayService?wsdl", array("trace" => 1, "exceptions" => 0)); $struct = new SOAPStruct('test',57971,'vbb'); $soapstruct = new SoapVar($struct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"); $result=$client->checkPaymentAbility(new SoapParam($soapstruct, "inputStruct")); print_r ($result);
ты не понял. Структуру запроса видно в wsdl берешь типы и подставляешь друг в друга. Получаешь нужный тебе xml.
затруднит, я не люблю работать за других у тебя в wsdl заданы описания структур. Код (Text): struct a { struct b; struct c; } struct b { int a; int b; } struct c { struct d; char a; } struct d { char *a; } Тебе надо подставить вместо struct b - то, что у нее внутри и т.д. в итоге ты получишь нечто Н-уровней вложенности, это и будет твой искомый xml.
ну да... так я ж вроде как так и делаю..... PHP: function SOAPStruct($s, $i, $f) { $this->paymentSystem = $s; $this->contractCode = $i; $this->service = $f; } P.S. Я не прошу работать за меня, а прошу помочь и разъяснить....
Вот то, что ты получил, задав параметры А как по твоему должен выглядеть этот же запрос исходя из wsdl? Возьми его и попробуй ручками поэлементно составить по нему(по wsdl) xml. Увидишь разницу (ну или отсутствие ее). Тогда будем прыгать дальше.
исходя из [css] <xs:element minOccurs="0" name="contractCode" type="xs:string"/> <xs:element minOccurs="0" name="createDate" type="xs:dateTime"/> <xs:element minOccurs="0" name="firmCode" type="xs:string"/> <xs:element minOccurs="0" name="foreignId" type="xs:string"/> <xs:element minOccurs="0" name="service" type="xs:string"/> [/css] настолько я понимаю, структура должна быть: PHP: $this->contractCode = '57971'; $this->CreateDate = '17.02.2008'; $this->firmCode = '1589'; $this->foreignId = 'a1b2c3'; $this->service = 'bb'; так же есть еще параметр: [css]<xs:element minOccurs="0" name="paymentSystem" type="xs:string"/>[/css], но он идет отдельно. Как я понимаю запрос должен иметь следующий вид: [css] <SOAP-ENV:Body><ns2:checkPaymentAbility xsi:type="ns1:SOAPStruct"><contractCode>57971</contractCode> <CreateDate>17.02.2008</CreateDate> <firmCode>1585</firmCode> <foreignId>a1b2c3</foreignId> <service>bb</service></ns2:checkPaymentAbility></SOAP-ENV:Body> [/css] + необходимо вставить <paymentSystem>test</paymentSystem> как и куда я понять не могу... такой тип отправки: PHP: $client->checkPaymentAbility(new SoapParam($soapstruct, "inputStruct"), array ('paymentSystem' => 'test')); Возвращает: [css]<SOAP-ENV:Body><ns2:checkPaymentAbility xsi:type="ns1:SOAPStruct"><contractCode>57971</contractCode><CreateDate>17.02.2008</CreateDate><firmCode>1589</firmCode><foreignId>a1b2c3</foreignId><service>bb</service></ns2:checkPaymentAbility><param1><item><key>paymentSystem</key><value>test</value></item></param1></SOAP-ENV:Body>[/css] Но как я понимаю это не то....
chiffa Ты Eclipse поставил? Зайди в него, там есть инструмент для работы с SOAP. Укажешь WSDL и параметры, он сгенерирует и пошлет запрос. Можно посмотреть и входящий и исходящий xml Что касается типов, еще раз говорю - смотри wsdl Вот что у тебя идет в запрос. Но оно является подтипом вот этого. Соответсвенно и выглядеть в запросе это будет несколько иначе. Я не работаю каждый день с SOAP, чтобы решать эту проблему, с одного взгляда на дамп. Мне точно также как тебе надо посмотреть исходник, послать проверочный запрос на деревню дедушке и посмотреть результат.