Я пытаюсь войти в API с помощью встроенных мыльных функций PHP. Я получил такой результат.
[LoginResult]=> false, [ErrorMsg] => Login failed with the reason : The security object is invalid
Это то, что требуется провайдером API.
<?xml version="1.0" encoding="utf-8"?> <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> <Login xmlns="http://tempuri.org/Example/Service1"> <objSecurity> <WebProviderLoginId>test</WebProviderLoginId> <WebProviderPassword>test</WebProviderPassword> <IsAgent>false</IsAgent> </objSecurity> <OutPut /> <ErrorMsg /> </Login> </soap:Body> </soap:Envelope>
&, вот что я смог создать с помощью функций.
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1"> <SOAP-ENV:Body> <ns1:Login> <objSecurity> <WebProviderLoginId>test</WebProviderLoginId> <WebProviderPassword>test</WebProviderPassword> <IsAgent>false</IsAgent> </objSecurity> <OutPut/> <ErrorMsg/> </ns1:Login> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Вот код, который я использовал для отправки запроса.
<?php class objSecurity { function objSecurity($s, $i, $f) { $this->WebProviderLoginId = $s; $this->WebProviderPassword = $i; $this->IsAgent = $f; } } class nextObject { function nextObject($objSecurity) { $this->objSecurity=$pobjSecurity; $this->OutPut=NULL; $this->ErrorMsg=NULL; } } $url = 'http://example.com/sampleapi/test.asmx?WSDL'; $client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1)); $struct = new objSecurity('test', 'test', false); $data = new nextObject($struct); $soapstruct2 = new SoapVar($data, SOAP_ENC_OBJECT); print_r( $client->__soapCall( "Login", array(new SoapParam($soapstruct2, "inputStruct")) ) ); echo $client->__getLastRequest(); ?>
Это те различия, которые я нашел.
В моем запросе xmlns:xsi
отсутствует.
Требование начинается с <soap:Envelope
, но мой запрос начинается с <SOAP-ENV:Envelope
.
В моем запросе есть дополнительный xmlns:ns1
.
& Тег имени функции начинается с ns1:
Пожалуйста, помогите мне сделать мой запрос в требуемом формате.
Я мало знаю о SOAP, и я использую PHP версии 5.3.13 с CakePHP 2.3.0. Извините за мой плохой английский.
Вот решение. :)
<?php $url = 'http://example.com/sampleapi/test.asmx?WSDL'; $client = new SoapClient($url, array("soap_version" => SOAP_1_1,"trace" => 1)); $user_param = array ( 'WebProviderLoginId' => "test", 'WebProviderPassword' => "test", 'IsAgent' => false ); $service_param = array ( 'objSecurity' => $user_param, "OutPut" => NULL, "ErrorMsg" => NULL ); print_r( $client->__soapCall( "Login", array($service_param) ) ); echo $client->__getLastRequest(); ?>
& запрос был:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/Example/Service1"> <SOAP-ENV:Body> <ns1:Login> <ns1:objSecurity> <ns1:WebProviderLoginId>test</ns1:WebProviderLoginId> <ns1:WebProviderPassword>test</ns1:WebProviderPassword> <ns1:IsAgent>false</ns1:IsAgent> </ns1:objSecurity> </ns1:Login> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Благодаря этой ссылке. PHP SOAP Request не прав