Могу ли я получить примеры кода, работающие с php и wsse?
Я попытался использовать пример, упомянутый в URL ниже. но запутался, как они строят здесь оболочку $. Может кто-нибудь сказать мне, как создать упаковщик и что он должен содержать. http://www.sis.utoronto.ca/web_services/code_samples.html.
Может ли кто-нибудь помочь мне здесь, так как я использую wsse в первый раз, поэтому не знаю, как его использовать. Я делаю мыльный вызов из PHP в.net wsse.
Пожалуйста, дайте мне знать, как передать заголовки в этом примере.
<?php
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);
}
} // class WSSESoapClient
$wsdl = 'Mywsdlurl';
$sClient = new WSSESoapClient ($wsdl,array( "trace" => 1 ));
$sClient->setWSSECredentials('username', 'password');
$wrapper->AccountName = new SoapVar("NEw User", XSD_STRING);
$wrapper->AccountInfo->propertyID = new SoapVar(2, XSD_STRING);
try {
$result = $sClient->CreateAccount($wrapper);
print_r($result);
} catch (SoapFault $fault) {
print("Fault string: " . $fault->faultstring . "\n");
print("Fault code: " . $fault->detail->WebServiceException->code . "\n");
}
echo $sClient->__getLastRequest();
// "<br>" .
// $sClient->__getLastResponse();
?>
Когда я проверяю __getLastRequest, он не присоединяет заголовки, определенные в _doRequest;
Пожалуйста, дайте мне знать, что я не так делаю здесь.
1 ответ
Я реализовал UserNameToken, используя PasswordDigest, в своем модуле Moodle, который интегрируется с веб-сервисами Skillsofts OLSA.
Взгляните на: http://code.google.com/p/moodle2-skillsoft-activity/source/browse/trunk/skillsoft/olsalib.php
Здесь я создаю оболочку вокруг PHP SoapClient для поддержки отправки UserNameToken с паролем дайджеста, вы можете настроить это, чтобы сделать простой пароль и т. Д. И т. Д.
Он имеет некоторый специфический код Moodle для получения таких вещей, как прокси-сервер и т. Д., А также для того, чтобы "кэшировать" WSDL в файловой системе (ускоряет настройку клиента, а не каждый раз, когда вы настраиваете его, снимая WSDL и т. Д.)
Затем посмотрите: http://code.google.com/p/moodle2-skillsoft-activity/source/browse/trunk/skillsoft/olsalib.php
Когда я вызываю один из веб-сервисов, вы видите, как настроен клиент и как передаются имя пользователя и пароль.