Хорошо, парни и девушки, которых я действительно пытался … это не недостаток усилий здесь …
У меня есть система, которая бронирует отели, события и управляет ею, и теперь мне нужно подключить сайтменеджер и другие сервисы. Это здорово, но я не могу понять, как это работает вообще … все, что я получаю, это единственная ошибка, которую я не могу понять, как заставить это работать.
Итак, давайте пойдем на охлаждение:
$auth = new \stdClass();
$auth->UsernameToken = new \stdClass();
$auth->UsernameToken->Username = $user;
$auth->UsernameToken->Password = $pw;
$client = new SoapClient($wsdl,array('trace'=>true));
$header = new SOAPHeader($ns, 'Security', $auth, false);
$hresp = $client->__setSoapHeaders($header);
//This is true... so my authentication is working perfect
//var_dump($hresp);
$arr = array(
'POS' => array(
'Source'=> array(
'RequestorID' => array(
'type'=>'22',
'ID'=>$id,
)
)
),
'AvailStatusMessages' => array(
'HotelCode'=>$hc,
'AvailStatusMessage' => array(
'StatusApplicationControl' => array(
'Start'=>'2016-10-01',
'End'=>'2016-10-01',
'InvTypeCode'=>'TR',
'RatePlanCode'=>'BAR'
),
'RestrictionStatus' => array(
'Status'=>'Close'
)
)
)
);try{
//here is my issue
$data = $client->__call('HotelAvailNotifRQ',array($arr));
if($data->Errors) {
foreach($data->Errors as $error) {
echo "Error: ".$error;
}
}else {
var_dump($data);
}
} catch (SoapFault $e) {
var_dump($e);
echo $e->faultstring;
}
Пытаясь это, я получаю эту ошибку: не удалось найти RequestorID / @ ID в теле мыла
Но, как вы можете видеть, я отправляю requestorID
Я пробовал по-разному: Object, XML-значения, SoapVar, SoapParam и многие другие разные способы … все, что я получаю, это та же самая ошибка … это означает, что я по какой-то причине не отправляю requestorID, когда я на самом деле отправляю Это!
Пары испытаний сделаны:
$arr = array(
'POS' => array(
'_' => array(
'Source' => array(
'_' => array(
'RequestorID' => array(
'type'=>'22',
'ID'=>$id,
)
)
)
)
),
);
$pos = new StdClass();
$pos->source->requestorID = $id;
$pos->source->type = 22;
$asm = new StdClass();
$asm->HotelCode = $hc;
$asm->AvailStatusMessage->StatusApplicationControl->Start = '2016-10-01';
$asm->AvailStatusMessage->StatusApplicationControl->End = '2016-10-02';
$asm->AvailStatusMessage->StatusApplicationControl->InvTypeCode = 'TR';
$asm->AvailStatusMessage->StatusApplicationControl->RatePlanCode = 'BAR';
$arr = array(
'POS' => $pos
'AvailStatusMessages' => $asm
);
$xml = "<SOAP-ENV:Envelope xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<SOAP-ENV:Body xmlns:SOAP-ENV='http://schemas.xmlsoap.org/soap/envelope/'>
<OTA_HotelAvailNotifRQ xmlns='http://www.opentravel.org/OTA/2003/05' Version='1.0' TimeStamp='2005-08-01T09:30:47+08:00' EchoToken='echo-abc123'>
<POS>
<Source>
<RequestorID Type='22' ID='$id'/>
</Source>
</POS>
<AvailStatusMessages HotelCode='$hc'>
<AvailStatusMessage>
<StatusApplicationControl Start='2010-01-01' End='2010-01-14' InvTypeCode='A1K' RatePlanCode='GLD'/>
<RestrictionStatus Restriction='Departure' Status='Close' />
</AvailStatusMessage>
</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>";
Так что, в основном, я перепробовал все возможные способы … что я мог придумать, чтобы отправить это на звонок и заставить его работать.
У кого-нибудь есть идеи, как правильно это сделать? Мне действительно нужна помощь здесь …
То, что я пытаюсь сделать, это:
https://siteminder.atlassian.net/wiki/pages/viewpage.action?pageId=2048374#space-menu-link-content
Заранее спасибо.
Ну, насколько я мог узнать в интернете … у меня не было ответа на мой вопрос, поэтому я должен был продолжать пытаться, пока я не заработаю. И я сделал!
Вот мой пример того, как с этим работать:
<?php
$RID = "BAR"; //Requestor ID
$url = 'https://cmtpi.siteminder.com/siteconnect/services/siteconnect_v1.1.0.wsdl';
$endpoint = 'https://cmtpi.siteminder.com/siteconnect/services';
$service_connect = "this is your endpoint";
$User = "test"; // username
$Password = "1234"; // password
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $endpoint);
curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml', 'Content-Length: ' . strlen($input_xml)));
$data = curl_exec($ch);
if(curl_exec($ch) === false){
echo 'Curl error: ' . curl_error($ch);
}else {
Header("Content-type: text/xml");
echo $data;
}
curl_close($ch);
С этой базовой системой система будет POST и XML-данные, а также получит ответ в XML-данных.
Мой $ input XML имел эти данные:
<SOAP-ENV:Envelope xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>
<wsse:Security SOAP-ENV:mustUnderstand="1">
<wsse:UsernameToken>
<wsse:Username>test</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<OTA_HotelAvailNotifRQ xmlns="http://www.opentravel.org/OTA/2003/05" Version="1.0" EchoToken="3c763f03-6333-4f38-9835-c7cf8433c263" TimeStamp="2016-11-25T18:30:29+01:00">
<POS>
<Source>
<RequestorID TYPE="22" ID="BAR"/>
<BookingChannel Primary="1" Type="1">
<CompanyName Code="TST">TEST</CompanyName>
</BookingChannel>
</Source>
</POS>
<AvailStatusMessages HotelCode="HOTEL_ID">
<AvailStatusMessage>
<StatusApplicationControl Start="2010-01-01" End="2010-01-01" InvTypeCode="A1K" RatePlanCode="GLD" />
<!-- Content omitted -->
</AvailStatusMessage>
<AvailStatusMessage>
<StatusApplicationControl Start="2010-01-02" End="2010-01-02" InvTypeCode="A1K" RatePlanCode="GLD" />
<!-- Content omitted -->
</AvailStatusMessage>
<AvailStatusMessage>
<StatusApplicationControl Start="2010-01-03" End="2010-01-03" InvTypeCode="A1K" RatePlanCode="GLD" />
<!-- Content omitted -->
</AvailStatusMessage>
</AvailStatusMessages>
</OTA_HotelAvailNotifRQ>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Когда я отправлю им это, они ответят базой данных … и мы начнем делать транзакции.
Моя главная проблема заключалась в том, как передать идентификатор REQUESTOR, идентификатор запросчика был в основном атрибутом ID из источника, который я показал до того, как пытался отправить его как объект или переменную … моя путаница заключалась в том, что я пытался сделать SOAP позвонить в XML-API … и все испортилось 🙂
Мой английский не очень хорош … но, по крайней мере, я здесь, чтобы показать свое решение.
Может быть, это может помочь кому-то в будущем.
Сделайте что-то вроде этого, это работает для меня:
$params = array(
'Target' => "Test",
'Version' => "1.0",
'POS' => array(
'Source' => array(
'RequestorID' => array(
'ID' => 'test',
'MessagePassword' => 'test',
),
),
),
'Criteria' => array(
'Criterion' => array(
'Address' => array(
'CountryName' => array(
'Code' => 'US',
),
),
),
)
);
$result = $client->HotelAvailNotif($params);
pre_d($result);
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<OTA_HotelAvailNotifRQ Target="Test" xmlns="http://www.test.com/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0">
<POS>
<Source>
<RequestorID ID="test" MessagePassword="test" />
</Source>
</POS>
<Criteria>
<Criterion>
<Address>
<CountryName Code="US"></CountryName>
</Address>
</Criterion>
</Criteria>
</OTA_HotelAvailNotifRQ >
</s:Body>
</s:Envelope>