PHP调用SOAP接口时SecurityToken处理不当致请求失败的解决方法
问题解决思路及修正代码
你的代码存在两个核心问题,导致了HTTP Bad Request错误:
- SecurityToken的位置错误:服务器要求将Token放在SOAP请求的Header中(对应SOAPUI里的
<soapenv:Header>节点),但你把它作为接口参数传递了。 - 请求参数结构不匹配:SOAPUI的请求Body里,
orderId是嵌套在<key>节点下的,但你的PHP代码直接将orderId作为顶层参数传入,不符合服务器的参数格式要求。
修正后的PHP代码
<?php $wsdl = "http://abcd.org/abcdServer/webservices/auth/ExternalOrderWebService?wsdl"; $client = new SoapClient($wsdl, array( 'soap_version' => SOAP_1_1, 'exceptions' => 1, 'trace' => 1 )); try { // 1. 构造SOAP Header,放置SecurityToken // 注意:$namespace需要匹配WSDL中定义Header的命名空间,可参考SOAPUI请求里的mis命名空间 $namespace = "http://abcd.webservices.xyz.abcd.eu/"; $soapHeader = new SoapHeader( $namespace, 'SecurityToken', 'd989aaf6-ea3c-429e-996c-4722b1d2ce3e', false ); $client->__setSoapHeaders($soapHeader); // 2. 构造符合要求的请求参数结构 $args = array( 'key' => array( 'orderId' => '00119-23' ) ); // 调用接口 $result = $client->exportOrder($args); print_r($result); } catch (SoapFault $e) { echo "错误信息: {$e}<br>"; // 打印请求/响应XML用于调试(开启trace=1才有效) echo "请求XML: " . htmlspecialchars($client->__getLastRequest()) . "<br>"; echo "响应XML: " . htmlspecialchars($client->__getLastResponse()) . "<br>"; } ?>
关键说明
1. SOAP Header的正确设置
通过SoapHeader类创建包含SecurityToken的请求头,再调用__setSoapHeaders将其绑定到SOAP客户端,这样发送的请求就会和SOAPUI的结构一致,把Token放在Header区域。
- 如果仍然报错,优先检查
$namespace是否正确:可以查看WSDL文件中的<wsdl:header>定义,或者对比__getLastRequest()输出的XML和SOAPUI的XML,调整命名空间。
2. 参数结构修正
服务器期望exportOrder方法接收一个包含key的对象,key内部才是orderId,所以参数必须嵌套成['key' => ['orderId' => 'xxx']]的格式,和SOAPUI中的<key><orderId>...</orderId></key>对应。
3. 调试技巧
开启trace => 1后,使用__getLastRequest()和__getLastResponse()可以打印实际发送和接收的XML,和SOAPUI的请求对比,能快速定位命名空间、参数结构等问题。
内容的提问来源于stack exchange,提问作者user25448
相关产品推荐
相关产品推荐

