带有标头身份验证的PHP SOAP请求

时间:2014-04-28 16:47:33

标签: php soap

我正在尝试使用下面的代码向供应商的Web服务发出SOAP请求:

 $client = new SoapClient('http://my.domain.com/wsdl/GuestService.WSDL', array('connection_timeout' => 15, 'trace' => 1));
 $ns = 'http://vendor.domain.com/';

 $headerbody = array('brand' => 'BRAND1', 
                'locale' => 'en_us', 
                'securityCredentials'=>array('applicationId'=>'ABCDEF', 'token'=>'123456789123456789123456789')); 

 $header = new SoapHeader($ns, 'Header', $headerbody);        

 $client->__setSoapHeaders($header); 

 $result = $client->getGuest(array('guestID' => '000787'));

然而,我收到的错误是没有提供凭证,所以我一定做错了。错误消息:未捕获的SoapFault异常:[soapenv:NO_CREDENTIALS]

我联系了供应商,他们向我发送了一份关于他们期望如何接收数据的XML样本:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prox="http://vendor.domain.com" xmlns:gues="http://vendor.domain.com/guest">
  <soapenv:Header>
  <prox:brand>BRAND1</prox:brand>
  <prox:locale>en_us</prox:locale>
  <prox:securityCredentials>
     <prox:applicationId>ABCDEF</prox:applicationId>
     <prox:token> 123456789123456789123456789</prox:token>
  </prox:securityCredentials>
  </soapenv:Header>
<soapenv:Body>
   <gues:getGuest>
     <guestID>000787</guestID>
  </gues:getGuest>
</soapenv:Body>
</soapenv:Envelope>

我以为我已经解释了上面的所有内容,但也许我错过了一些明显的东西。非常感谢任何帮助!

更新: 我下载了SoapUI,所以我可以看到发生了什么。事实证明,生成的XML几乎是正确的,只有一个小问题....标题是在XML中插入<item><key>标记:

<securityCredentials>
    <item>
        <key>applicationId</key>
        <value>ABCDEF</key>
    </item>
</securityCredentials>

我需要的是:

<securityCredentials>
    <applicationId>ABCDEF</applicationId>
    <token>123456</token>
</securityCredentials>

如果我可以删除标签,那么XML就是正确的。我已经研究过,似乎无法找到特定的标志或设置,所以仍然坚持下一步该做什么。

0 个答案:

没有答案