我正在尝试使用下面的代码向供应商的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就是正确的。我已经研究过,似乎无法找到特定的标志或设置,所以仍然坚持下一步该做什么。