Как создать клиент wsdl php мыло с wsHTTPBinding?

Я пытаюсь сделать клиент php из wsdl, который использует службу WCF.
Мне удалось использовать веб-сервис с консольным приложением C #, только передавая учетные данные (сертификация pem не требуется).

URL-адрес для wsdl следующий (это тестовая среда):

https://extenavigator.ukho.gov.uk/serviceB2B/submitUKHOOrdering.svc?wsdl

Так что, если кто-то хочет попробовать создать мыльный клиент, используйте этот wsdl.

«Попытка получить доступ с учетной записью, у которой нет соответствующего разрешения службы, приведет к ответу с подтверждением ProcessResult.Failure и к сообщению, добавленному в свойство Messages: service [serviceName] недоступно для пользователя [userId]» (от провайдера).

Поэтому работающий мыльный клиент с неправильными учетными данными должен вернуть указанное выше сообщение.

Для того, чтобы сначала создать мыльный клиент в php, я создал классы-заглушки через wsdl2phpgenerator. Затем я создаю экземпляр мыльного клиента, как показано ниже:

ini_set('max_execution_time', 480);
ini_set('default_socket_timeout', 400);

$orderServiceClient = new OrderingService(array('login' => DIST_B2B_USERNAME, 'password' => DIST_B2B_PASSWORD, "trace"=>1,
"exceptions"=>1, 'cache_wsdl' => WSDL_CACHE_MEMORY, 'soap_version' => SOAP_1_2, 'keep_alive' => false,
"connection_timeout" => 240, 'verifypeer' => false, 'verifyhost' => false, "ssl_method" => SOAP_SSL_METHOD_TLS));

где OrderingService является классом-заглушкой, который расширяет класс клиента SOAP.

Наконец, я вызываю такой метод:

$getHoldingsRequest = new GetHoldingRequest(DIST_ID, 25555, ProductType::AVCSCharts); // set some params for the called method

$responce = $orderServiceClient->GetHoldings($getHoldingsRequest); // call the method

Я получаю ошибку: Ошибка получения заголовков http

Я включил ssl в php.ini и в файле apache conf. Я использую ПК с Windows.

Я прочитал эти сообщения:

Подключение к защищенной WS-Security веб-службе с помощью PHP

Исключение SoapFault: [HTTP] Ошибка при получении заголовков http

Я выяснил, что проблема в том, что мыльный заголовок должен быть настроен для передачи учетных данных («Проверка подлинности имени пользователя и пароля по SSL»)

Я также попытался создать собственные заголовки мыла:

 class WsseAuthHeader extends SoapHeader
{
private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
function __construct($user, $pass, $ns = null)
{
if ($ns)
{
$this->wss_ns = $ns;
}

$auth = new stdClass();

$auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns);
$auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns);
$username_token = new stdClass();
$username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns);
$security_sv = new SoapVar(
new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns),
SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns);

parent::__construct($this->wss_ns, 'Security', $security_sv, true);
}
}

а также

 $wsse_header = new WsseAuthHeader("xxxx", "xxxx");

$orderServiceClient = new OrderingService(array('trace' => true, 'exceptions' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY,
'soap_version' => SOAP_1_2, 'keep_alive' => false, 'connection_timeout' => 240));

$orderServiceClient->__setSoapHeaders(array($wsse_header));

в заключение

$getHoldingsRequest = new GetHoldingRequest(DIST_ID, 25555, ProductType::AVCSCharts);
$getHoldingsRequest->setRequestId($GUID);

try {
$responce = $orderServiceClient->GetHoldings($getHoldingsRequest);

} catch (Exception $e) {
echo $e->getMessage();
}echo "<pre>" . var_export($orderServiceClient->__getLastRequest(), TRUE) . "</pre>";

Я получил:

Ошибка при получении http заголовков

НОЛЬ

Я также пробовал другие вещи, упомянутые в вышеупомянутых постах, но безрезультатно.

Из сообщений, упомянутых выше:

«Но, как я уже сказал выше: я думаю, что для того, чтобы это работало, требуется гораздо больше знаний о спецификации WS-Security и данной архитектуре сервиса».

Так что, если кто-то имеет опыт работы с мыльным клиентом и может создать php-клиент для этого wsdl, это было бы очень полезно.

Для GUID я использовал следующую функцию:

  function getGUID(){
if (function_exists('com_create_guid')){
return com_create_guid();
}else{
mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45);// "-"$uuid = chr(123)// "{".substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12)
.chr(125);// "}"return $uuid;
}
}

$GUID = getGUID();

0

Решение

Я новичок и не уверен, что мое сообщение будет полезным или нет, но я постараюсь вам помочь — если у вас уже есть файл WSDL или URL, тогда

-Вы можете использовать PHP SoapClient

  • пожалуйста, игнорируйте, если сообщение не соответствует вашему требованию

Попробуйте следовать примеру, приведенному ниже, а также вашей файловой структуре WSDL (удерживая
функция и параметр через XML)

Все зависит от вас, вы можете поместить код шага 1 и шага 2 в класс / функцию, или можете просто использовать данный способ.

Шаг 1-

пытаться
{

$ client = new SoapClient (SOAP_CLIENT_WSDL_URL, массив (‘soap_version’ => SOAP_VERSION, ‘trace’ => true));
вернуть $ client;

} catch (SoapFault $ fault) {

trigger_error («Ошибка SOAP: (код ошибки: {$ fault-> код ошибки}, строка ошибок: {$ fault-> faultstring})», E_USER_ERROR);

умереть();

}

Шаг 2-

result = $ client-> your_wsdl_conisting_function («follow_wsdl_parameter»)

$ xml_last_response = $ client -> __ getLastResponse ();

echo »; print_r ($ xml_last_response);

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]