Проблемы с отправкой SOAP-аутентификационных заголовков в php - PullRequest
5 голосов
/ 30 ноября 2010

Я очень новичок в SOAP (то есть не знаю!)

Клиент попросил меня взаимодействовать с существующей службой SOAP, для которой требуется аутентификация через мои заголовки SOAP (простое имя пользователя и пароль)

В моем распоряжении 3 метода,

IsAlive IsAliveSecure ChangeUserDetails

IsAlive просто возвращает true, и я могу назвать его без проблем

IsAliveSecure возвращает true справильная авторизация, и я не могу заставить его вернуть true.

в основном мне нужно отправить следующий запрос:

POST /ripplecomprovisioning.asmx HTTP/1.1
Host: provisioning.example.ie
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.blueface.ie/provisioning/IsAliveSecure"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <SoapAuthHeader xmlns="http://www.example.ie/provisioning/">
      <Username>myusername</Username>
      <Password>mypassword</Password>
    </SoapAuthHeader>
  </soap:Header>
  <soap:Body>
    <IsAliveSecure xmlns="http://www.example.ie/provisioning/" />
  </soap:Body>
</soap:Envelope>

Мой вопрос заключается в том, как отправить запрос, отформатированный как указано выше, в php?

это то, что я пытался, но безуспешно:

$ soapClient = new SoapClient ("https://provisioning.example.ie/ripplecomprovisioning.asmx?WSDL");

// Prepare SoapHeader parameters 
$sh_param = array( 
            'Username'    =>    'myusername', 
            'Password'    =>    'mypassword'); 
$headers = new SoapHeader('ripplecomprovisioning', 'SoapAuthHeaders', $sh_param); 

// Prepare Soap Client 
$soapClient->__setSoapHeaders(array($headers)); 
     $result = $soapClient->isAlive();

echo var_dump($result);

echo "<br /><br />";

   $result = $soapClient->IsAliveSecure();

echo var_dump($result);

вывод из приведенного выше выглядит следующим образом:

object(stdClass)#3 (1) {
  ["IsAliveResult"]=>
  bool(true)
}
<br /><br />
Fatal error: Uncaught SoapFault exception: [soap:Server] System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
   at example.VoIP.Provisioning.RipplecomProvisioningServices.IsAliveSecure()
   --- End of inner exception stack trace --- in /var/www/ripplecomweb/authentication/soap.php:20
Stack trace:
#0 [internal function]: SoapClient->__call('IsAliveSecure', Array)
#1 /var/www/ripplecomweb/authentication/soap.php(20): SoapClient->IsAliveSecure()
#2 {main}
  thrown in /var/www/ripplecomweb/authentication/soap.php on line 20

Любая помощь с этим будет принята с благодарностью. Я не могу позволить себе потерпеть неудачу !!

Спасибо

Кев

1 Ответ

1 голос
/ 30 марта 2011

Ну, было бы намного проще, если бы мы могли видеть WSDL сервиса. Но попробуйте эти шаги:

1. Проверьте WSDL для метода isAliveSecure, чтобы узнать, нужно ли ему что-то передавать.

2. Посмотрите, как на самом деле выглядит отправляемый вами запрос:

var_dump($soapClient->__getLastRequest());
var_dump($soapClient->__getLastRequestHeaders());

(убедитесь, что вы создаете экземпляр $soapClient с параметром 'trace' => TRUE для этих методов, иначе они не будут работать -> см. Руководство по PHP ).

3. Попробуйте отправить запрос в форме, которая, как вы уверены, должна быть правильной вручную через командную строку, например:

curl -v -k -d @/path/to/the/file/with/the/request/xml http://service_url
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...