我尝试在PHP中创建用于与WS-Security
(第一次)通信的脚本:
require ('WSSoapClient.php');
$soapclient = new WSSoapClient('https://katastr.cuzk.cz/trial/dokumentace/ws22/wsdp/vyhledat_v22.wsdl');
$soapclient->__setUsernameToken('username', 'password');
$params = array('katastrUzemiKod'=>693936, 'kmenoveCislo'=>1385);
$response = $soapclient->__soapCall('najdiParcelu', $params);
var_dump($response);
这个脚本失败了:
PHP致命错误:未捕获的SoapFault异常:[wsse:InvalidSecurity] 验证安全策略消息时出错错误代码:1000 in /home/jura/bin/WSSoapClient.php:75
有什么方法可以看,这个脚本究竟发送到服务器的是什么以及响应是什么?
答案 0 :(得分:1)
问题是$ soapclient-> __ setUsernameToken('用户名'密码')功能正在期待' PasswordDigest'或者' PasswordText'。
这在WSSoapClient类中处理得很糟糕。如果缺少passwordType参数,它应该抛出异常。它试图做的是:
// $this->generateWSSecurityHeader() returns an empty string if 3rd parameter missing.
$this->__setSoapHeaders($this->generateWSSecurityHeader());
如果PHP像我一样处于严格模式,你会得到这些警告:
PHP警告:SoapClient :: __ setSoapHeaders():无效的SOAP标头......
警告:SoapClient :: __ setSoapHeaders():无效的SOAP标头......
您需要找出密码类型并将其作为setUsernameToken()函数中的第3个参数传递。