За последние 24 часа нас посетили 18914 программистов и 1709 роботов. Сейчас ищут 992 программиста ...

Soap, авторизация через header

Тема в разделе "PHP для новичков", создана пользователем injection, 8 окт 2014.

  1. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    День добрый.

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

    Есть Soap WSDL сервер с авторизацией через header

    Код (Text):
    1.  
    2. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
    3.    <soapenv:Header>
    4.       <tem:AuthentificationHeader>
    5.          <!--Optional:-->
    6.          <tem:userName>User</tem:userName>
    7.          <!--Optional:-->
    8.          <tem:password>Password</tem:password>
    9.       </tem:AuthentificationHeader>
    10.    </soapenv:Header>
    11.    <soapenv:Body>
    12.       <tem:CheckLocTax>
    13.          <tem:txn_id>55</tem:txn_id>
    14.          <!--Optional:-->
    15.          <tem:txn_date>TYT DATA</tem:txn_date>
    16.          <!--Optional:-->
    17.          <tem:account>22411198701645</tem:account>
    18.          <tem:sum>5.20</tem:sum>
    19.       </tem:CheckLocTax>
    20.    </soapenv:Body>
    21. </soapenv:Envelope>
    Теперь вопрос, как мне при помощи php авторизоваться и отправить необходимые поля. Конечно я могу показаться глупым, но пробывал так

    Код (Text):
    1.  
    2. $query = new stdClass;
    3. $query->txn_id = '55';
    4. $query->txn_date = '20141007102750';
    5. $query->account = '22411198701645';
    6. $query->sum = '5';
    7.  
    8. $client = new SoapClient('http://example.com/path_to.asmx?WSDL');
    9. $headers = array();
    10. $headers[] = new SoapHeader('AuthentificationHeader','userName','User');
    11. $headers[] = new SoapHeader('AuthentificationHeader','password','Password');
    12. $client->__setSoapHeaders($headers);
    13. $result = $client->CheckLocTax($query);
    14.  
    15. print_r($result);
    на что приходит ответ

    Код (Text):
    1.  
    2. stdClass Object
    3. (
    4.     [CheckLocTaxResult] => stdClass Object
    5.         (
    6.             [any] => 551Object reference not set to an instance of an object.0
    7.         )
    8.  
    9. )
    Такой же ответ приходит если я через SOAPUI убираю header. То есть получается у меня не авторизуется клиент.

    Пожалуйста помогите :(
     
  2. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    1) Всегда смотри глазами, что отсылаешь, что получаешь:
    Код (PHP):
    1. var_dump("REQUEST", $client->__getLastRequest());
    2. var_dump("RESPONSE", $client->__getLastResponse());
    3.  
    2)
    Код (PHP):
    1. $headers = array();
    2. $headers[] = new SoapHeader('AuthentificationHeader','userName','User');
    3. $headers[] = new SoapHeader('AuthentificationHeader','password','Password');
    4.  
    Посмотрев свои запросы, ты увидишь, что ты отсылаешь 2 массива в заголовке вместо 1 корректного заголовка.

    Поэтому, я бы в заголовок положил объект.
    Что-то типа:
    Код (PHP):
    1. class AuthentificationHeader {
    2.     public $username;
    3.     public $password;
    4.  
    5.     public function __construct($username, $password) {
    6.         $this->userName = $username;
    7.         $this->password = $password;
    8.     }
    9. }
    10.  
    11. $header = new SoapHeader('http://tempuri.org/', 'AuthentificationHeader', new AuthentificationHeader('user', 'pwd'), false);
    12. $client->__setSoapHeaders(array($header));
    13.  
     
  3. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    Спасибо огромное, жаль плюсануть нельзя.

    Посмотрев на Ваш совет, который помог, я понимаю что php мне учить и учить, впрочем этим я и занимаюсь.

    :)

    Добавлено спустя 37 минут 59 секунд:
    а из за чего когда я так же хочу посмотреть что приходить и что уходить
    Код (Text):
    1.  
    2. var_dump("REQUEST", $client->__getLastRequest());
    3. var_dump("RESPONSE", $client->__getLastResponse());
    Возвращяется ответ типа

    Код (Text):
    1.  
    2. string(7) "REQUEST"
    3. NULL
    4.  
    5. string(8) "RESPONSE"
    6. NULL
     
  4. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Код (PHP):
    1. $client = new SoapClient('http://example.com/path_to.asmx?WSDL',
    2.                 array(
    3.                         'trace' => 1,
    4.                 ));
    5.  
     
  5. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    и вправду.
    очень неудобно спрашивать, но все же надеюсь последнее :(

    если через клиента SOAPUI отправить запрос, ответ приходит в таком виде

    Код (Text):
    1.  
    2. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3.    <soap:Body>
    4.       <PayLocTaxResponse xmlns="http://tempuri.org/">
    5.          <PayLocTaxResult>
    6.             <response xmlns="">
    7.                <osmp_txn_id>11</osmp_txn_id>
    8.                <prv_txn>20272</prv_txn>
    9.                <sum>152.00</sum>
    10.                <result>0</result>
    11.                <comment>OK</comment>
    12.                <fields>
    13.                   <field1 name="disp1">Иванов Вася Васильевич</field1>
    14.                   <field2 name="disp2">1</field2>
    15.                </fields>
    16.             </response>
    17.          </PayLocTaxResult>
    18.       </PayLocTaxResponse>
    19.    </soap:Body>
    20. </soap:Envelope>
    а php возвращяет вот в таком

    Код (Text):
    1.  
    2. object(stdClass)#5 (1) {
    3.   ["CheckLocTaxResult"]=>
    4.   object(stdClass)#6 (1) {
    5.     ["any"]=>
    6.     string(221) "550Иванов Вася Васильевич1"
    7.   }
    8. }
    как возможно вернуть ответ в корректном массиве. что бы как то разделить по пунктам??
     
  6. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Ты получешь опять-же готовый для работы объект.
    Код (PHP):
    1. var_dump($result->CheckLocTaxResult);
    2. echo $result->CheckLocTaxResult->any;
    3.  
     
  7. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    а возможно ли как то разделить по пунктам?
     
  8. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Это каким таким пунктам?
    Я чойта не понял.
     
  9. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    Через SoapUI приходит такой ответ
    Код (Text):
    1.  
    2. <PayLocTaxResult>
    3.             <response xmlns="">
    4.                <osmp_txn_id>11</osmp_txn_id>
    5.                <prv_txn>20272</prv_txn>
    6.                <sum>152.00</sum>
    7.                <result>0</result>
    8.                <comment>OK</comment>
    9.                <fields>
    10.                   <field1 name="disp1">Иванов Вася Васильевич</field1>
    11.                   <field2 name="disp2">1</field2>
    12.                </fields>
    13.             </response>
    14.          </PayLocTaxResult>
    а через php все пункты без какого либо разделения приходит в таком вот виде

    Код (Text):
    1.  
    2. ["any"]=>
    3.     string(221) "550Иванов Вася Васильевич1"
    Возможно ли как то возвращять данные в более сортированном массиве что бы было типо

    Код (Text):
    1.  
    2. osmp_txn_id=>55
    3. sum=>152.00
     
  10. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Еще раз: тебе уже вернули объект.
    Ты его и крути так, как тебе хочется:
    Код (PHP):
    1. $result->PayLocTaxResult->response;
    2. $result->PayLocTaxResult->osmp_txn_id;
    Внимательнее посмотри, что ты получил.
    При этом ты в UI суешь один запрос, а в клиенте - другой.
    Код (Text):
    1. $client->__getLastResponse()
    Возвращает такой-же не обработаный xml, как и та тулза.
     
  11. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    дело в том что если делать так

    Код (Text):
    1.  
    2. $result->PayLocTaxResult->response;
    3. $result->PayLocTaxResult->osmp_txn_id;
    то ничего не возвращяется, есть только 1 елемент массива ANY и все.
    а ответ возвращяется в качестве 1 строки в any

    550Иванов Вася Васильевич1, где идейно 55 это osmp_txn_id. 0 result и т.д.
     
  12. Ke1eth

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

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Повторю еще раз:
    Код (PHP):
    1. var_dump($client->__getLastResponse()) 
    Смотри глазами, проверяй.
    Возможно что-то с именами пространств.
    Проверяй весь выхлоп SOAP.

    добавь в конструктор клиента:
    'exceptions' => 1,
     
  13. injection

    injection Новичок

    С нами с:
    16 окт 2013
    Сообщения:
    24
    Симпатии:
    0
    Благодарю, все получилось.
    Благодарю, все получилось.