Я должен разработать SOAP-клиент, и поставщик пришлет мне следующие спецификации:
Я использую класс 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, ));