PHP中如何使用SoapClient构造指定格式的SOAP请求调用接口
PHP SoapClient 调用SOAP接口修复方案
你代码的核心问题是SOAP头的结构、名称和官方要求的请求格式不匹配,修正方案如下:
核心错误说明
- SOAP头节点名称错误:官方要求的头节点名称是
Header,你代码中错误填写为RequestorCredentials - 头参数层级错误:你代码中头参数多套了一层
SamplingSoapHeader,官方要求Header节点下直接放置UserName和Password节点 - 缺少调试参数:未开启请求 trace 无法核对实际发送的请求内容是否符合要求
修正后可运行代码
<?php $username = 'USERNAME'; $password = 'PASSWORD'; // 确认此处密码和接口要求一致 $soapURL = "http://www.example.com/interface.asmx?WSDL"; // 初始化时开启调试参数,方便出错排查 $client = new \SoapClient($soapURL, [ 'trace' => true, 'exceptions' => true, ]); // 头参数直接声明用户名、密码,无需额外外层 $auth = [ 'UserName' => $username, 'Password' => $password, ]; // 第二个参数传入正确的头节点名称Header $header = new \SoapHeader('http://www.example.com/interface/', 'Header', $auth); $client->__setSoapHeaders($header); try { $response = $client->GetExampResult(["rollNumber" => "1703011"]); print_r($response); } catch (\SoapFault $e) { // 出错时打印错误信息和实际发送的请求,直接和官方示例对比即可快速定位问题 echo "接口调用错误:" . $e->getMessage() . PHP_EOL; echo "实际发送的请求XML:" . PHP_EOL; echo htmlspecialchars($client->__getLastRequest()) . PHP_EOL; }
额外排查要点
- 若调用仍然异常,直接对比
__getLastRequest()输出的XML和官方给的示例请求,差异部分就是需要调整的内容 - 确认接口地址、用户名、密码、rollNumber等参数值的正确性,避免参数值错误导致调用失败
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

