Выполнение SOAP-запроса по HTTPS с использованием PHP и NuSOAP - PullRequest
4 голосов
/ 02 мая 2011

Я застрял с этим уже несколько дней и, похоже, нигде не могу найти ответ, хотя думаю, что это довольно распространенная задача. Кто-нибудь может помочь?

Я пытаюсь использовать PHP и NuSOAP для подключения к веб-сервису. Веб-сервис требует, чтобы я использовал как ssl-сертификат, так и передавал параметры аутентификации в запросе мыла. По предположению администраторов веб-службы запрос должен выглядеть следующим образом:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <o:UsernameToken>
                <o:Username>username</o:Username>
                <o:Password>password</o:Password>
            </o:UsernameToken>
        </o:Security>
    </s:Header>
    <s:Body>
        <PriceQuote xmlns="a_url">
            <PartnerProfileId>a_unique_partner_id_we_have</PartnerProfileId>
            <Reservation xmlns:d4p1="another_url" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

                * a bunch of stuff

            </Reservation>
        </PriceQuote>
    </s:Body>
</s:Envelope>

Я пытался выяснить, как это сделать, используя NuSOAP. Прямо сейчас, это то, что у меня есть (я не знаю, как передать параметры аутентификации или использовать имеющиеся у меня файлы сертификатов):

<code>$client = new nusoap_client("https://endpoint_url");
$client->soap_defencoding = 'UTF-8'; 

$result = $client->call("PriceQuote", "");

// For debugging
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '
'; echo '

Response

'; echo '
' . htmlspecialchars($client->response, ENT_QUOTES) . '
'; echo '

Debug

'; echo '
' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

Используя приведенный выше код отладки, я вижу, что это ответ, который я получаю от веб-службы:

HTTP/1.1 500 Internal Server Error
Date: Mon, 02 May 2011 13:42:14 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Length: 347

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <s:Fault>
            <faultcode xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                a:InvalidSecurity
            </faultcode>
            <faultstring xml:lang="sv-SE">
                An error occurred when verifying security for the message.
            </faultstring>
        </s:Fault>
    </s:Body>
</s:Envelope>

Этот ответ, конечно, неудивителен, так как я не передаю никакие параметры аутентификации в запросе.

Кто-нибудь знает, как я могу передать имя пользователя и пароль в заголовке запроса SOAP, а также как я могу использовать имеющиеся у меня файлы сертификатов ssl? Как вы, вероятно, можете сказать, я довольно плохо знаком с веб-сервисами и NuSOAP. Если что-то в моем вопросе не имеет смысла, пожалуйста, дайте мне знать.

1 Ответ

2 голосов
/ 02 мая 2011

если вам не нужен nu_soap, вы можете решить эту проблему с помощью сценария ниже

<?PHP
$client = new SoapClient("http://Your Wsdl Location", array("trace" => 0));
$HeaderSecurity = array("UsernameToken"=>array("Username"=>"YourUserName",
                                          "Password"=>"YourPassword",
                                )

);

$header[] = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security",$HeaderSecurity);

$client->__setSoapHeaders($header);
//$client->__setLocation("https://YourTargetLocation/"); if you have wsdl file you don't need to use this line 
$REsponse = $client->YourRequest();
?>
...