Проблема заключалась в связи 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"
}