День добрый. 2 день бодаюсь, с авторизацией через header в soap. Возможно я не так понимаю документацию, а возможно моя не внимательность, но результата мне пока не дали, поэтому хотелось бы совета спросить у вас, уважаемые гуру этого форума. Есть Soap WSDL сервер с авторизацией через header Код (Text): <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/"> <soapenv:Header> <tem:AuthentificationHeader> <!--Optional:--> <tem:userName>User</tem:userName> <!--Optional:--> <tem:password>Password</tem:password> </tem:AuthentificationHeader> </soapenv:Header> <soapenv:Body> <tem:CheckLocTax> <tem:txn_id>55</tem:txn_id> <!--Optional:--> <tem:txn_date>TYT DATA</tem:txn_date> <!--Optional:--> <tem:account>22411198701645</tem:account> <tem:sum>5.20</tem:sum> </tem:CheckLocTax> </soapenv:Body> </soapenv:Envelope> Теперь вопрос, как мне при помощи php авторизоваться и отправить необходимые поля. Конечно я могу показаться глупым, но пробывал так Код (Text): $query = new stdClass; $query->txn_id = '55'; $query->txn_date = '20141007102750'; $query->account = '22411198701645'; $query->sum = '5'; $client = new SoapClient('http://example.com/path_to.asmx?WSDL'); $headers = array(); $headers[] = new SoapHeader('AuthentificationHeader','userName','User'); $headers[] = new SoapHeader('AuthentificationHeader','password','Password'); $client->__setSoapHeaders($headers); $result = $client->CheckLocTax($query); print_r($result); на что приходит ответ Код (Text): stdClass Object ( [CheckLocTaxResult] => stdClass Object ( [any] => 551Object reference not set to an instance of an object.0 ) ) Такой же ответ приходит если я через SOAPUI убираю header. То есть получается у меня не авторизуется клиент. Пожалуйста помогите
1) Всегда смотри глазами, что отсылаешь, что получаешь: Код (PHP): var_dump("REQUEST", $client->__getLastRequest()); var_dump("RESPONSE", $client->__getLastResponse()); 2) Код (PHP): $headers = array(); $headers[] = new SoapHeader('AuthentificationHeader','userName','User'); $headers[] = new SoapHeader('AuthentificationHeader','password','Password'); Посмотрев свои запросы, ты увидишь, что ты отсылаешь 2 массива в заголовке вместо 1 корректного заголовка. Поэтому, я бы в заголовок положил объект. Что-то типа: Код (PHP): class AuthentificationHeader { public $username; public $password; public function __construct($username, $password) { $this->userName = $username; $this->password = $password; } } $header = new SoapHeader('http://tempuri.org/', 'AuthentificationHeader', new AuthentificationHeader('user', 'pwd'), false); $client->__setSoapHeaders(array($header));
Спасибо огромное, жаль плюсануть нельзя. Посмотрев на Ваш совет, который помог, я понимаю что php мне учить и учить, впрочем этим я и занимаюсь. Добавлено спустя 37 минут 59 секунд: а из за чего когда я так же хочу посмотреть что приходить и что уходить Код (Text): var_dump("REQUEST", $client->__getLastRequest()); var_dump("RESPONSE", $client->__getLastResponse()); Возвращяется ответ типа Код (Text): string(7) "REQUEST" NULL string(8) "RESPONSE" NULL
и вправду. очень неудобно спрашивать, но все же надеюсь последнее если через клиента SOAPUI отправить запрос, ответ приходит в таком виде Код (Text): <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"> <soap:Body> <PayLocTaxResponse xmlns="http://tempuri.org/"> <PayLocTaxResult> <response xmlns=""> <osmp_txn_id>11</osmp_txn_id> <prv_txn>20272</prv_txn> <sum>152.00</sum> <result>0</result> <comment>OK</comment> <fields> <field1 name="disp1">Иванов Вася Васильевич</field1> <field2 name="disp2">1</field2> </fields> </response> </PayLocTaxResult> </PayLocTaxResponse> </soap:Body> </soap:Envelope> а php возвращяет вот в таком Код (Text): object(stdClass)#5 (1) { ["CheckLocTaxResult"]=> object(stdClass)#6 (1) { ["any"]=> string(221) "550Иванов Вася Васильевич1" } } как возможно вернуть ответ в корректном массиве. что бы как то разделить по пунктам??
Ты получешь опять-же готовый для работы объект. Код (PHP): var_dump($result->CheckLocTaxResult); echo $result->CheckLocTaxResult->any;
Через SoapUI приходит такой ответ Код (Text): <PayLocTaxResult> <response xmlns=""> <osmp_txn_id>11</osmp_txn_id> <prv_txn>20272</prv_txn> <sum>152.00</sum> <result>0</result> <comment>OK</comment> <fields> <field1 name="disp1">Иванов Вася Васильевич</field1> <field2 name="disp2">1</field2> </fields> </response> </PayLocTaxResult> а через php все пункты без какого либо разделения приходит в таком вот виде Код (Text): ["any"]=> string(221) "550Иванов Вася Васильевич1" Возможно ли как то возвращять данные в более сортированном массиве что бы было типо Код (Text): osmp_txn_id=>55 sum=>152.00
Еще раз: тебе уже вернули объект. Ты его и крути так, как тебе хочется: Код (PHP): $result->PayLocTaxResult->response; $result->PayLocTaxResult->osmp_txn_id; Внимательнее посмотри, что ты получил. При этом ты в UI суешь один запрос, а в клиенте - другой. Код (Text): $client->__getLastResponse() Возвращает такой-же не обработаный xml, как и та тулза.
дело в том что если делать так Код (Text): $result->PayLocTaxResult->response; $result->PayLocTaxResult->osmp_txn_id; то ничего не возвращяется, есть только 1 елемент массива ANY и все. а ответ возвращяется в качестве 1 строки в any 550Иванов Вася Васильевич1, где идейно 55 это osmp_txn_id. 0 result и т.д.
Повторю еще раз: Код (PHP): var_dump($client->__getLastResponse()) Смотри глазами, проверяй. Возможно что-то с именами пространств. Проверяй весь выхлоп SOAP. добавь в конструктор клиента: 'exceptions' => 1,