Клиент SOAP через HTTPS с сертификатами SSL с обеих сторон

Я должен разработать SOAP-клиент, и поставщик пришлет мне следующие спецификации:

  • Будет передаваться через HTTPS через IP и будет упакован как XML-документы, которые приспосабливаются к разным разборам схемы XML.
  • Коммуникации синхронны, третья сторона должна ждать ответа.
  • Каждый запрос и ответ будут подписаны.

Я использую класс soapClient из PHP, и все работает нормально, за исключением случаев, когда я пытаюсь использовать свой закрытый ключ для установления связи с сервером:

Code: WSDL | Message: SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://remoteserver/CustomerManagementService?wsdl' : failed to load external entity "https://remoteserver/CustomerManagementService?wsdl 

Затем я попытался создать файл .pem, он содержит личный ключ, связанный с моим сертификатом, как я читал: как отправить запрос SOAP с сертификатом SSL в PHP?

Но он все равно возвращает ошибку:

 SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://remoteserver:80/CustomerManager/proxy/CustomerManagementService?WSDL%2FGWTCommonResources%2Fwsdl%2FGWTCommonMessages' : failed to load external entity "http://remoteserver:80/CustomerManager/proxy/CustomerManagementService?WSDL%2FGWTCommonResources%2Fwsdl%2FGWTCommonMessages 

Интересно, есть ли какой-то способ получить именно необработанные данные, которые отправляются классом soapClient PHP. И где я должен установить сертификат поставщика.

Я уже пробовал с «$ client -> __ getLastRequest ()», но я получаю NULL. Это мой код:

 $client = new anotherSoapClient($service, array( 'local_cert' => $pem, 'style' => SOAP_RPC, 'use' => SOAP_ENCODED, 'soap_version' => SOAP_1_2, 'authentication'=> SOAP_AUTHENTICATION_DIGEST, 'ssl' => array( 'ciphers'=> "SHA1", 'verify_peer' => false, 'allow_self_signed' => true ), 'https' => array( 'curl_verify_ssl_peer' => false, 'curl_verify_ssl_host' => false ), 'cache_wsdl' => WSDL_CACHE_NONE, 'cache_ttl' => 86400, 'trace' => true, 'exceptions' => true, )); // Test connection echo BR.'Functions: <pre>';var_dump($client->__getFunctions());echo '</pre>'; $XMLrequest = $client->prepareRequest($email); $response = $client->__anotherRequest('getCustomerInfo', $XMLrequest); echo "REQUEST:\n" . $client->__getLastRequest() . "\n"; 

Кстати, я использую PHP 5.4.9 на своей локальной машине, а на сервере есть PHP 5.3.10, а anotherSoapClient – класс, который расширяет класс soapClient PHP : PHP soapClient отправляет собственный XML

Для отладки предложений ваш запрос SOAP должен расширить класс SoapClient.

 class SoapClientDebug extends SoapClient { public function __doRequest($request, $location, $action, $version, $one_way = 0) { // Add code to inspect/dissect/debug/adjust the XML given in $request here // Uncomment the following line, if you actually want to do the request // return parent::__doRequest($request, $location, $action, $version, $one_way); } } 

И затем используйте его в своем запросе:

 $client = new SoapClientDebug("x.wsdl"); $response = $client->__soapCall($function); echo $client->__getLastRequest(); 

Надеюсь, это поможет отладить ваш код!

Вероятно, вам нужно указать следующие параметры SoalClient:

 $defaultEndpoint = "https://remoteserver/CustomerManagementService"; $uri = "https://remoteserver"; $client = new anotherSoapClient($service, array( 'local_cert' => $pem, 'location' => $defaultEndpoint, 'uri' => $uri, 'style' => SOAP_RPC, 'use' => SOAP_ENCODED, 'soap_version' => SOAP_1_2, 'authentication'=> SOAP_AUTHENTICATION_DIGEST, 'ssl' => array( 'ciphers'=> "SHA1", 'verify_peer' => false, 'allow_self_signed' => true ), 'https' => array( 'curl_verify_ssl_peer' => false, 'curl_verify_ssl_host' => false ), 'cache_wsdl' => WSDL_CACHE_NONE, 'cache_ttl' => 86400, 'trace' => true, 'exceptions' => true, ));