Создание вызова WSSE Auth SOAP для API WebServices в PHP с помощью SoapClient

У меня есть следующее из API поставщика: введите здесь описание изображения

и мне нужно было создать вызов Soap с помощью php. Как мне это сделать? пока у меня есть это: но не работает:

private function booking_soap_connect() {
        // the wsdl URL of your service to test 
        $serviceWsdl = 'https://apitest.com/bookingapi.asmx?WSDL';

        // the parmeters to initialize the client with 
        $serviceParams = array(
            'login' => 'un',
            'password' => 'pw'
        );

        // create the SOAP client 
        $client = new SoapClient($serviceWsdl, $serviceParams);

        $data['Brand'] = "All";
        $data['TourCode'] = "QBE";
        $data['DepartureCode'] = "8000321";
        $data['VendorId'] = "test";
        $data['VendorPassword'] = "test";

        $results = $client->GVI_DepartureInfo($data)
        echo $results;
    }

Пожалуйста помоги


person CodeGodie    schedule 12.03.2014    source источник


Ответы (3)


РЕШЕНИЕ: наконец-то я получил это с помощью следующего кода:

class WsseAuthHeader extends SoapHeader {

    private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-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);
    }

}

$username = 'test';
$password = 'test123';
$wsdl = 'https://yoururl.com/api.asmx?WSDL';

$wsse_header = new WsseAuthHeader($username, $password);

$client = new SoapClient($wsdl, array(
    //"trace" => 1,
    //"exceptions" => 0
        )
);

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


$request = array(
    "functionResponseName" => array(
        'param1' => "string",
        "param2" => "string"
    )
);

$results = $client->FunctionName($request);

var_dump($results);
person CodeGodie    schedule 13.03.2014
comment
Не могли бы вы сказать, отличается ли это от ответа stackoverflow.com/a/6677930/367456, и если он отличается, укажите короче в чем отличия? Я знаю, что прошло много времени с тех пор, как вы ответили, но вы, вероятно, сможете взглянуть. - person hakre; 22.12.2014
comment
Сначала попробуйте, и все работает нормально ... Спасибо !! - person Gabriel Anderson; 02.06.2016
comment
Спаситель жизни! Откуда вы взяли этот код? - person Leeeeeeelo; 20.11.2016
comment
Приятно .. не помню, откуда взял. Думаю, я сам придумал, это было давно. Рад, что это помогло тебе. - person CodeGodie; 21.11.2016

Вместо этого используйте Nusoap, ваш клиент Soap может не работать с вашей версией php.

person leo    schedule 12.03.2014

Посмотрите на этот мой предыдущий ответ на странице Отправить XML с php по почте. Должно быть все необходимое для правильной обработки SOAP в php.

person Fanda    schedule 12.03.2014
comment
Я просмотрел этот и многие другие ответы, но не пошел. - person CodeGodie; 12.03.2014
comment
Часть ведьмы вам не подходит? Будьте конкретны. Почему вы голосуете против? Уточните свой вопрос. - person Fanda; 12.03.2014
comment
Я голосую против, потому что вы не даете мне ответа. вы просто указываете мне на другие ссылки, которые я уже просматривал ... Я не могу этого сделать. У меня есть код, который я пробовал выше, и он просто выдает ошибку. Я написал код выше. Все, что я прошу, это чтобы кто-нибудь просмотрел и увидел, где я сделал ошибку - person CodeGodie; 12.03.2014
comment
Итак, в конце концов, посмотрите мой ответ еще раз, как заставить его работать. - person Fanda; 12.03.2014