akxxiv
Новичок
Возникла необходимость интегрироваться со сторонним сервисом по API, построенном на SOAP. Описание API здесь
Для тестов попробовал это сделать через SoapUI где все работает нормально - запросы отправляются, ответы получаются.
Начал реализовывать в PHP, и вот тут начались проблемы. Во-первых, по HTTPS был не доступен WSDL, но это решалось установкой сертификата. А вот далее...
1. Все запросы почему-то идут по HTTP, и как это исправить не через ж...? Если посмотреть WSDL, то там есть 2 точки входа - HTTP и HTTPS, и SOAP почему-то выбирает первый. В тех поддержке сказали:
2. И вторая проблема в том, что даже если запрос был отправлен по HTTPS, я не получаю вообще ни какого ответа. А прямой POST (через file_get_contents ) запрос вообще зависает. Хотя в SoapUI - такой же запрос, с теми же заголовками отрабатывается на ура. Приведу пример своего запроса и того что отсылает SoapUI
Мой:
А вот скрин из SoapUI Картинка
Есть идеи что я не так делаю? Может сталкивался кто?
Для тестов попробовал это сделать через SoapUI где все работает нормально - запросы отправляются, ответы получаются.
Начал реализовывать в PHP, и вот тут начались проблемы. Во-первых, по HTTPS был не доступен WSDL, но это решалось установкой сертификата. А вот далее...
PHP:
$login = 'grad';
$password = 'DxB1gma3';
$wsdl = 'https://testservice.synerdocs.ru/ExchangeService.svc?singlewsdl';
$contextOptions = array(
"ssl"=>array(
"verify_peer"=>true,
"allow_self_signed"=>true,
"cafile"=> __DIR__ . "/cer/synerdocs-rootCA.pem",
"verify_depth"=>5,
)
);
$sslContext = stream_context_create($contextOptions);
$client = new SoapClient( $wsdl, [
'soap_version' => SOAP_1_1,
'trace' => true,
'cache_wsdl' => WSDL_CACHE_DISK, //WSDL_CACHE_NONE,
'stream_context' => $sslContext,
'ssl_method' => SOAP_SSL_METHOD_SSLv3,
]);
$params = [
'login' => $login,
'password' => $password,
];
$result = $client->__soapCall(
"Authenticate",
[$params]
);
var_dump($result);
И вот вопрос - Есть возможность указать по какому адресу надо стучаться, как отправить через BasicHttpBinding_IExchangeService?Есть предположение, что вы используете биндинг BasicHttpBinding_IExchangeService, если это так, то попробуйте отправить через BasicHttpBindingSecure_IExchangeService
XML:
<wsdl:service name="ExchangeService">
<wsdl:port name="BasicHttpBinding_IExchangeService" binding="tns:BasicHttpBinding_IExchangeService">
<soap:address location="https://testservice.synerdocs.ru/ExchangeService.svc"/>
</wsdl:port>
<wsdl:port name="BasicHttpBindingSecure_IExchangeService" binding="tns:BasicHttpBindingSecure_IExchangeService">
<soap:address location="https://testservice.synerdocs.ru/ExchangeService.svc"/>
</wsdl:port>
</wsdl:service>
Мой:
PHP:
$xml = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://synerdocs.ru"><SOAP-ENV:Body><ns1:Authenticate><ns1:login>grad</ns1:login><ns1:password>DxB1gma3</ns1:password></ns1:Authenticate></SOAP-ENV:Body></SOAP-ENV:Envelope>';
$data_len = strlen($xml);
$options = array(
'http' =>
array(
'method' => 'POST',
'protocol_version' => 1.1,
'header' => "Content-Type: text/xml; charset=utf-8\r\n"
//."POST https://testservice.synerdocs.ru/ExchangeService.svc HTTP/1.1\r\n"
."Accept-Encoding: gzip,deflate\r\n"
."Host: testservice.synerdocs.ru\r\n"
."Connection: Keep-Alive\r\n"
."SOAPAction: http://synerdocs.ru/IExchangeService/Authenticate\r\n"
."Content-Length: {$data_len}\r\n"
."\r\n"
.$xml,
//'content' => $xml
'timeout' => 10
),
'ssl' => [
"verify_peer"=>true,
"allow_self_signed"=>true,
"cafile"=> __DIR__ . "/cer/synerdocs-rootCA.pem",
"verify_depth"=>5,
],
);
$context = stream_context_create($options);
$res = file_get_contents( 'https://testservice.synerdocs.ru/ExchangeService.svc', false, $context );
Есть идеи что я не так делаю? Может сталкивался кто?