2010-11-30 89 views
5

我是很新的SOAP(即没有任何线索!)问题在PHP发送SOAP AUTH头

有人问我有一个客户与需要通过我的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的=新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

那么这将是一个容易得多,如果我们可以看到该服务的WSDL。 但请尝试执行以下步骤:

1.检查isDLiveSecure方法的WSDL以查看是否必须传递某些内容。

2.See你要发送的请求,真的是这样的:

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

(确保你实例化$soapClient用这些方法的选项'trace' => TRUE,否则将无法正常工作 - >见PHP manual )。

3.Try发送在你一定应该是正确的通过命令行手动形式的要求,是这样的:

curl -v -k -d @/path/to/the/file/with/the/request/xml http://service_url