У меня возникли проблемы с подключением к службе wsdl через PHP. Проблема, похоже, связана с аутентификацией. Вот мой код:
$soapURL = "http://myurl?wsdl"; $soapLogin = Array( 'User ID'=>'myusername', 'Password'=>"mypassword" ); $soapClient = new SoapClient($soapURL, $soapLogin); $soapResult = $soapClient->mySoapFunction();
У меня есть имя пользователя и пароль, как определено клиентом, и я могу увидеть XML-файл, который генерирует wsdl, но нет, я не могу распознать, правильно ли ссылаюсь на имя пользователя и пароль. При попытке подключения я получаю следующую ошибку:
Fatal error: Uncaught SoapFault exception: [a:InvalidSecurity] An error occurred when verifying security for the message. in E:\xampp\htdocs\TRMSosf\index.php:15 Stack trace: #0 E:\xampp\htdocs\TRMSosf\index.php(15): SoapClient->__call('GetWeekEvents', Array) #1 E:\xampp\htdocs\TRMSosf\index.php(15): SoapClient->GetWeekEvents('10', '20130527') #2 {main} thrown in E:\xampp\htdocs\TRMSosf\index.php on line 15
Я новичок в использовании SOAP и довольно новичок в PHP, любая помощь приветствуется.
Я нашел ответ в другой статье здесь: могу ли я получить образцы кода, работающие с php и wsse
он включал класс, который обрабатывал аутентификацию WSSE
class WSSESoapClient extends SoapClient { protected $wsseUser; protected $wssePassword; public function setWSSECredentials($user, $password) { $this->wsseUser = $user; $this->wssePassword = $password; } public function __doRequest($request, $location, $action, $version, $one_way = 0) { if (!$this->wsseUser or !$this->wssePassword) { return parent::__doRequest($request, $location, $action, $version, $one_way = 0); } // get SOAP message into DOM $dom = new DOMDocument(); $dom->loadXML($request); $xp = new DOMXPath($dom); $xp->registerNamespace('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/'); // search for SOAP header, create one if not found $header = $xp->query('/SOAP-ENV:Envelope/SOAP-ENV:Header')->item(0); if (!$header) { $header = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Header'); $envelope = $xp->query('/SOAP-ENV:Envelope')->item(0); $envelope->insertBefore($header, $xp->query('/SOAP-ENV:Envelope/SOAP-ENV:Body')->item(0)); } // add WSSE header $usernameToken = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:UsernameToken'); $username = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:Username', $this->wsseUser); $password = $dom->createElementNS('http://schemas.xmlsoap.org/ws/2002/07/secext', 'wsse:Password', $this->wssePassword); $usernameToken->appendChild($username); $usernameToken->appendChild($password); $header->appendChild($usernameToken); // perform SOAP call $request = $dom->saveXML(); return parent::__doRequest($request, $location, $action, $version, $one_way = 0);
}