curl — интеграция с php Sabre Soap API для отелей

После проверки подлинности Sabre отсюда

https://developer.sabre.com/docs/read/soap_basics/Authentication

Хотите получить результаты Sabre SOAP API с помощью php, но есть проблемы с получением ответа, используя curl, как показано в следующем коде

$input_xml = '
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Header>
<eb:MessageHeader SOAP-ENV:mustUnderstand="1" eb:version="1.0">
<eb:ConversationId/>
<eb:From>
<eb:PartyId type="urn:x12.org:IO5:01">999999</eb:PartyId>
</eb:From>
<eb:To>
<eb:PartyId type="urn:x12.org:IO5:01">123123</eb:PartyId>
</eb:To>
<eb:CPAId>IPCC</eb:CPAId>
<eb:Service eb:type="OTA">SessionCreateRQ</eb:Service>
<eb:Action>SessionCreateRQ</eb:Action>
<eb:MessageData>
<eb:MessageId>1000</eb:MessageId>
<eb:Timestamp>2001-02-15T11:15:12Z</eb:Timestamp>
<eb:TimeToLive>2001-02-15T11:15:12Z</eb:TimeToLive>
</eb:MessageData>
</eb:MessageHeader>
<wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/12/utility">
<wsse:UsernameToken>
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password>PASSWORD</wsse:Password>
<Organization>IPCC</Organization>
<Domain>DEFAULT</Domain>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<eb:Manifest SOAP-ENV:mustUnderstand="1" eb:version="1.0">
<eb:Reference xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="cid:rootelement" xlink:type="simple"/>
</eb:Manifest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>';
$url = $envUrl;

//setting the curl parameters.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// Following line is compulsary to add as it is:
curl_setopt($ch, CURLOPT_POSTFIELDS,
"xmlRequest=" . $input_xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
$data = curl_exec($ch);
curl_close($ch);

//convert the XML result into array
$array_data = json_decode(json_encode(simplexml_load_string($data)), true);

print_r('<pre>');
print_r($array_data);
print_r('</pre>');

$array_data ничего не возвращает + также пытался создать сессию раньше

https://developer.sabre.com/docs/read/soap_apis/session_management/create_session

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

0

Решение

Этому вопросу несколько месяцев, но, возможно, мой ответ все же может быть полезным.

Мне удалось успешно использовать PHP и CURL для взаимодействия с SOAP API Сабре. Глядя на ваш код и сравнивая его с моим, у меня есть несколько предложений:

1) Попробуйте передать некоторую информацию заголовка HTTP с помощью вашего вызова SOAP следующим образом (я помню, что это несколько важно):

$action = 'SessionCreateRQ'; // Set this to whatever Sabre API action you are calling

$soapXML = $input_xml; // Your SOAP XML

$headers = array(
'Content-Type: text/xml; charset="utf-8"',
'Content-Length: ' . strlen($soapXML),
'Accept: text/xml',
'Keep-Alive: 300',
'Connection: keep-alive',
'Cache-Control: no-cache',
'Pragma: no-cache',
'SOAPAction: "' . $action . '"'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $soapXML);

2) После вашего вызова curl_exec проверьте следующие ошибки, которые должны помочь с отладкой:

$data = curl_exec($ch);
if(curl_error($ch)) {
echo "Curl error: " . curl_error($ch);
} else {
echo $data;
...
}

3) Многие вызовы API Sabre SOAP требуют, чтобы вы сначала создали сеанс. Так что для этого часто требуется сделать запрос SOAP с SessionCreateRQ, после чего вы можете сделать еще один вызов SOAP для желаемого действия, а затем еще один запрос SOAP к SessionCloseRQ, чтобы закрыть сеанс. Каждый SOAP-запрос должен правильно задавать полный заголовок и полезную нагрузку, что может быть болезненно, но это необходимый поток.

Надеюсь, это поможет!

1

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

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

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