Веб-служба Amadeus e-Power - проблемы с настройкой заголовков аутентификации SOAP - PullRequest
0 голосов
/ 01 марта 2019

У меня проблемы с настройкой AuthenticationSoapHeader для сервисов Amadeus e-Power.Я использую встроенный в PHP SoapClient.

WSDL: https://staging -ws.epower.amadeus.com / ws_usitcolours / EpowerService.asmx? WSDL

Базовый класс, который я создал, чтобы проверить вещи:

class AmadeusSoapClient
{
    private $_client;
    private $_config = [
        'wsdl' => 'https://staging-ws.epower.amadeus.com/ws_usitcolours/EpowerService.asmx?WSDL',
        'namespace' => 'https://epowerv5.amadeus.com.tr/WS', 
        'auth' => [
            'username' => '...',
            'password' => '...'
        ], 
        'debug' => true
    ];

    // Construct
    public function __construct()
    {   
        // Client
        $this->_client = new \SoapClient($this->_config['wsdl'], [
            'trace' => $this->_config['debug']
        ]); 

        // Headers
        $headers = [ 
            // Auth
            new \SoapHeader($this->_config['namespace'], 'AuthenticationSoapHeader', [
                'WSUserName' => $this->_config['auth']['username'], 
                'WSPassword' => $this->_config['auth']['password']
            ]),     
        ]; 

        // Set headers 
        $this->_client->__setSoapHeaders($headers);
    }  

    // Request: CurrencyConversion
    public function currencyConversion($fromCurrency = 'BGN', $toCurrency = 'EUR', $amount = 1.00)
    { 
        $method = 'CurrencyConversion';
        $params = [
            'OTA_CurrencyConversionRQ' => [
                '_' => '',
                'FromCurrency' => $fromCurrency,
                'ToCurrency' => $toCurrency,
                'Amount' => $amount,
            ], 
        ];

        try { 
            return $this->_client->__call($method, [$params]);  
        } catch (\Exception $e) {
            // ...
        }  
    } 
}

Пример использования:

$client = new \AmadeusSoapClient();
$client->currencyConversion(); 

Получена ошибка:

stdClass Object
(
    [OTA_CurrencyConversionRS] => stdClass Object
        (
            [Errors] => stdClass Object
                (
                    [Error] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [_] => 
                                    [Type] => EpowerInternalError
                                    [ErrorCode] => EPW.0000
                                    [ShortText] => User Name is required
                                    [Code] => A001
                                    [NodeList] => EPower
                                    [BreakFlow] => 
                                )

                            [1] => stdClass Object
                                (
                                    [_] => 
                                    [Type] => EpowerInternalError
                                    [ErrorCode] => EPW.0000
                                    [ShortText] => Password is required
                                    [Code] => A001
                                    [NodeList] => EPower
                                    [BreakFlow] => 
                                )
                        )
                )
        )
)

Неважно, если я установлю заголовки с помощью __setSopHeaders или передам их методом __call, они всегда игнорируются. любые другие идеи, какустановить их?

Запросы для методов, которые не требуют аутентификации, работают должным образом.

Интересно то, что один и тот же запрос работает с Postman, но не с PHP SoapClient или SoapUI.Postman successful Soap request

1 Ответ

0 голосов
/ 23 марта 2019

Проблема заключалась в связи SSL между встроенным SoapClient PHP и сервером .NET Amadeus.Каким-то образом не удалось установить SSL-соединение, независимо от того, как я установил (принудительно) Soap для использования SSL. Я всегда получал ошибку https connection must be used.

К сожалению, у меня не было больше свободного времени для дальнейших исследований иЯ решил переключиться на CURL.Вот простой класс, который я сделал.Надеюсь, это кому-нибудь поможет!

class AmadeusClient
{
    private $_config = [
        'wsdl' => 'https://staging-ws.epower.amadeus.com/ws_usitcolours/EpowerService.asmx?WSDL',
        'namespace' => 'http://epowerv5.amadeus.com.tr/WS',
        'auth' => [
            'username' => '...',
            'password' => '...'
        ],
        'sessionCookieName' => 'ASP.NET_SessionId',
        'debug' => true
    ];

    public function testCall()
    {
        $fromCurrency = 'BGN';
        $toCurrency = 'USD';        
        $amount = 15.00;
        $result = $this->currencyConversionRequest($fromCurrency, $toCurrency, $amount);
        echo '<pre>';
        var_dump($result);
        exit; 
    }

    // Request: Currency conversion
    public function currencyConversionRequest($fromCurrency = 'BGN', $toCurrency = 'EUR', $amount = 1.00)
    {
        $method = 'CurrencyConversion';
        $params = [
            'OTA_CurrencyConversionRQ' => [
                '_attributes' => [
                    'FromCurrency' => $fromCurrency,
                    'ToCurrency' => $toCurrency,
                    'Amount' => $amount,
                ]
            ],
        ];

        $result = $this->sendRequest($method, $params);
        if (isset($result->Body->CurrencyConversionResponse->OTA_CurrencyConversionRS->Success)) {
            $array = (array) $result->Body->CurrencyConversionResponse->OTA_CurrencyConversionRS->attributes();
            if (!empty($array['@attributes'])) {
                return $array['@attributes'];
            }
        }
        return false;
    } 

    public function sendRequest($method, $params)
    {
        $body = \Helpers\ArrayToXml::convert($params, [
            'rootElementName' => $method,
            '_attributes' => [
                'xmlns' => $this->_config['namespace']
            ]
        ]);
        $requestBody = '
            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                <soap:Header>
                    <AuthenticationSoapHeader xmlns="'. $this->_config['namespace'] .'">
                        <WSUserName>'. $this->_config['auth']['username'] .'</WSUserName>
                        <WSPassword>'. $this->_config['auth']['password'] .'</WSPassword>
                    </AuthenticationSoapHeader>
                </soap:Header>
                <soap:Body>
                    '. str_replace('<?xml version="1.0"?>', '', $body) .'
                </soap:Body>
            </soap:Envelope>
        '; 

        $headers = [
            'Content-type: text/xml; charset=utf-8',
            'Accept: text/xml',
            'Cache-Control: no-cache',
            'Pragma: no-cache',
            'SOAPAction: '. $this->_config['namespace'] .'/'. $method,
            'Content-length: '. mb_strlen($requestBody),
        ];
        $ch = curl_init($this->_config['wsdl']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_VERBOSE, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $output = curl_exec($ch);
        curl_close($ch);

        $cleanXml = str_ireplace(['SOAP-ENV:', 'SOAP:'], '', $output);
        return simplexml_load_string($cleanXml);
    }
}

Начиная с \ Helpers \ ArrayToXml, это просто простой класс Spatie , который преобразует PHP Array в XML.Источник: https://github.com/spatie/array-to-xml

Запрос XML, сгенерированный вышеуказанным классом:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
        <AuthenticationSoapHeader xmlns="http://epowerv5.amadeus.com.tr/WS">
            <WSUserName>...</WSUserName>
            <WSPassword>...</WSPassword>
        </AuthenticationSoapHeader>
    </soap:Header>
    <soap:Body>
        <CurrencyConversion xmlns="http://epowerv5.amadeus.com.tr/WS">
            <OTA_CurrencyConversionRQ FromCurrency="BGN" ToCurrency="USD" Amount="15"/>
        </CurrencyConversion>
    </soap:Body>
</soap:Envelope>

Ответ:

array(3) {
  ["Amount"]=>
  string(4) "9.00"
  ["TruncatedAmount"]=>
  string(4) "8.67"
  ["OtherChargesAmount"]=>
  string(4) "8.67"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...