PHP调用WSDL接口触发[HTTP] Unauthorized错误求助
我在PHP中尝试调用基于WSDL的接口,遇到了如下错误:
Fatal error: Uncaught SoapFault exception: [HTTP] Unauthorized
WSDL地址:https://servis.turkiye.gov.tr/services/g2g/kdgm/test/uetdsarizi?wsdl
我的index.php代码如下:
$istek = new SoapClient('https://servis.turkiye.gov.tr/services/g2g/kdgm/test/uetdsarizi?wsdl'); $auth = new stdClass(); $auth->Username = '999999'; $auth->Password = '999999testtest'; $header = new SoapHeader('https://servis.turkiye.gov.tr/services/g2g/kdgm/test/uetdsarizi?wsdl', 'AuthHeader', $auth, false); $istek->__setSoapHeaders($header); echo "<pre>"; print_r($istek->__getTypes()); echo "</pre>"; echo "<hr /><br /><br /><br />"; $sonuc = $istek->seyahatIzinKontrol(array( 'wsuser' => array( 'kullaniciAdi' => '999999', 'sifre' => '999999testtest') , 'tcKimlikNo' => '15058023598') ); if ($sonuc->seyahatIzinKontrol) { echo 'OK'; }else { echo 'ERROR'; };
实际报错信息详情:
Fatal error: Uncaught SoapFault exception: [HTTP] Unauthorized in C:\xampp\htdocs\index.php:72 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://servis....', 'http://uetds.un...', 1, 0) #1 C:\xampp\htdocs\index.php(72): SoapClient->__call('seyahatIzinKont...', Array) #2 {main} thrown in C:\xampp\htdocs\index.php on line 72
请问问题出在哪里?
你的代码存在两个核心问题导致了HTTP Unauthorized错误:
1. SoapHeader命名空间错误
创建SoapHeader时,第一个参数要求传入接口定义的命名空间URI,而非WSDL文件的URL。从报错信息中的http://uetds.un...以及WSDL的实际定义来看,正确的命名空间应为http://uetds.unsps.gov.tr/,你当前传入的WSDL地址不符合接口要求。
2. 重复传递认证信息
你同时通过SoapHeader和seyahatIzinKontrol方法参数传递了认证信息,但该接口仅需通过SoapHeader进行身份验证,方法参数中重复传递的wsuser属于冗余操作,甚至可能干扰接口的认证逻辑。
修正后的代码
try { // 创建SoapClient实例,开启trace方便调试请求响应内容 $istek = new SoapClient('https://servis.turkiye.gov.tr/services/g2g/kdgm/test/uetdsarizi?wsdl', [ 'trace' => true, 'exceptions' => true ]); // 使用正确的命名空间创建认证Header $auth = new stdClass(); $auth->Username = '999999'; $auth->Password = '999999testtest'; $header = new SoapHeader('http://uetds.unsps.gov.tr/', 'AuthHeader', $auth, false); $istek->__setSoapHeaders($header); echo "<pre>"; print_r($istek->__getTypes()); echo "</pre>"; echo "<hr /><br /><br /><br />"; // 调用方法时仅传递业务参数,移除冗余的wsuser $sonuc = $istek->seyahatIzinKontrol([ 'tcKimlikNo' => '15058023598' ]); // 注意返回结果的字段名应为seyahatIzinKontrolResult(根据WSDL定义) if ($sonuc->seyahatIzinKontrolResult) { echo 'OK'; print_r($sonuc); } else { echo 'ERROR'; } } catch (SoapFault $e) { // 打印详细错误及请求响应,方便排查 echo "<pre>"; echo "错误信息: " . $e->getMessage() . "\n"; echo "请求XML: " . $istek->__getLastRequest() . "\n"; echo "响应XML: " . $istek->__getLastResponse() . "\n"; echo "</pre>"; }
额外排查建议
- 确认
999999和999999testtest是接口提供的有效测试凭据,无效凭据也会触发Unauthorized错误。 - 检查PHP是否开启了
openssl扩展,HTTPS协议的接口依赖该扩展才能正常通信。 - 若仍报错,通过
__getLastRequest()和__getLastResponse()查看实际发送的XML,对比WSDL定义确认参数结构是否完全匹配。
内容的提问来源于stack exchange,提问作者user19863355

