За последние 24 часа нас посетили 67669 программистов и 1649 роботов. Сейчас ищут 898 программистов ...

PHP + SOAP помогите разобраться

Тема в разделе "Прочие вопросы по PHP", создана пользователем chiffa, 14 дек 2009.

  1. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    С чем? С этим? :)
    Все проблемы заключаются исключительно в нашем незнании. Сама технология проста. И никакой она не epic fail.

    Поконкретнее? О чем написать? В обычных случаях и стандартных примерах все работает.

    Проблемы начинаются при интеграции с сервисами Java/C#, там используются более мощные библиотеки чем в PHP. И соотвественно часто используются сложные (complex) типы.
    Основная сложность в том, чтобы понять как объяснить PHP, что нужно создать примерно вот такой xml
    HTML:
    1. <request>
    2.   <soapMethod>
    3.     <param name="param1" type="methodParam">
    4.       <property1 property2="value2">
    5.         <value>value1</value>
    6.       </property1>
    7.     </param>
    8.   </soapMethod>
    9. </request>
    Потому что он норовит создать вот такой :)
    HTML:
    1. <request>
    2.   <soapMethod>
    3.     <param name="param1" type="methodParam">
    4.       <property1>
    5.         <value>value1</value>
    6.       </property1>
    7.       <property2>
    8.         <value>value2</value>
    9.       </property2>
    10.     </param>
    11.   </soapMethod>
    12. </request>
    Пример конечно упрощен :) но для сути - достаточно.

    И поскольку я так и нерешил этот вопрос окончательно :) то и мануала писать не о чем :) Попадется похожая задача, разберусь как это работает, тогда может и напишу :)
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Такие скорее всего надо "ручками" делать, тобишь не стандартным способом, а внедрением кода.
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Я так и решил когда-то - но это некузявый метод за который мне стыдно :)

    В простейшем примере как я привел, мне удалось разобраться :)
    В более сложных вариантах с 4-5 уровнями вложенности типов - не сложилось :)

    Тем не менее генерировать xml ручками - это неправильно. Иначе весь смысл технологии пропадает :)
     
  4. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    отож...
     
  5. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Simpliest

    ну, хз.. строки и числа нормально передаются и так..
     
  6. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    почему то когда отправляю запрос
    PHP:
    1. $param=array ("paymentSystem"=>'test', "contractCode"=>'57971', "service"=>'bb', "CreateDate"=>'17.02.2008');
    2. $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]
     
  7. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    насколько я понял там нужно передать заполненный объект, но как его передать не знаю...
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    я на предыдущей странице давал пример кода.
    Поиграйся с ним до получения нужной структуры.
     
  9. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    а мог бы проставить комментарии что там к чему?....
     
  10. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    вроде как получилось. запрос формируется с данными:

    [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]

    но возвращает код ошибки с которого видно что ошибка в структуре. не подскажете как я могу сверить структуру и правильность ее составления?....
     
  11. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
  12. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    я понимаю что по идеи должно быть не xsi но wdsl... не поскажешь как задать? использую такой запрос:

    PHP:
    1.  class SOAPStruct {
    2.         function SOAPStruct($s, $i, $f) {
    3.             $this->paymentSystem = $s;
    4.             $this->contractCode = $i;
    5.             $this->service = $f;
    6.  
    7.         }
    8.     }
    9.     $client = new SoapClient("https://*******/PayService?wsdl", array("trace" => 1, "exceptions" => 0));
    10.  
    11.  
    12.     $struct = new SOAPStruct('test',57971,'vbb');
    13.     $soapstruct = new SoapVar($struct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd");
    14. $result=$client->checkPaymentAbility(new SoapParam($soapstruct, "inputStruct"));
    15.  
    16.  
    17. print_r ($result);
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    ты не понял.
    Структуру запроса видно в wsdl

    берешь типы и подставляешь друг в друга. Получаешь нужный тебе xml.
     
  14. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    если не затруднит, мог бы помочь примером как правильно выбрать необходимы типы?...
     
  15. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    затруднит, я не люблю работать за других :)

    у тебя в wsdl заданы описания структур.
    Код (Text):
    1. struct a {
    2.     struct b;
    3.     struct c;
    4. }
    5. struct b {
    6.    int a;
    7.    int b;
    8. }
    9.  
    10. struct c {
    11.    struct d;
    12.    char a;
    13. }
    14.  
    15. struct d {
    16.    char *a;
    17. }
    Тебе надо подставить вместо struct b - то, что у нее внутри и т.д.

    в итоге ты получишь нечто Н-уровней вложенности, это и будет твой искомый xml.
     
  16. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    ну да... так я ж вроде как так и делаю.....

    PHP:
    1.   function SOAPStruct($s, $i, $f) {
    2.               $this->paymentSystem = $s;
    3.               $this->contractCode = $i;
    4.               $this->service = $f;
    5.  
    6.           }
    P.S. Я не прошу работать за меня, а прошу помочь и разъяснить....
     
  17. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Вот то, что ты получил, задав параметры
    А как по твоему должен выглядеть этот же запрос исходя из wsdl?
    Возьми его и попробуй ручками поэлементно составить по нему(по wsdl) xml. Увидишь разницу (ну или отсутствие ее). Тогда будем прыгать дальше.
     
  18. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
  19. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    исходя из


    [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:
    1.     $this->contractCode = '57971';
    2.             $this->CreateDate = '17.02.2008';
    3.             $this->firmCode = '1589';
    4.             $this->foreignId = 'a1b2c3';
    5.             $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:
    1. $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]

    Но как я понимаю это не то....
     
  20. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    это какой-то капец....
     
  21. chiffa

    chiffa Активный пользователь

    С нами с:
    14 дек 2009
    Сообщения:
    17
    Симпатии:
    0
    не надо так скептически, или ты всегда все схватывал на лету и с первого раза? :)
     
  22. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    chiffa
    Ты Eclipse поставил? Зайди в него, там есть инструмент для работы с SOAP.
    Укажешь WSDL и параметры, он сгенерирует и пошлет запрос.
    Можно посмотреть и входящий и исходящий xml

    Что касается типов, еще раз говорю - смотри wsdl
    Вот что у тебя идет в запрос.
    Но оно является подтипом вот этого.
    Соответсвенно и выглядеть в запросе это будет несколько иначе.

    Я не работаю каждый день с SOAP, чтобы решать эту проблему, с одного взгляда на дамп.
    Мне точно также как тебе надо посмотреть исходник, послать проверочный запрос на деревню дедушке и посмотреть результат.
     
  23. nimistar

    nimistar Активный пользователь

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    - накаркал - блин