[英]Soap Call for sitemider PHP
好吧,我真的嘗試過……這里並不缺乏努力……
我有一個系統可以預訂酒店、活動和管理它,現在我必須連接站點管理器和其他服務。 這很好,但我根本無法理解它是如何工作的......我得到的只是一個錯誤,我無法理解如何使它工作。
所以讓我們開始編碼:
$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
我嘗試了不同的方式,對象、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
提前致謝。
做這樣的事情,它對我有用:
$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>
就我在互聯網上所能找到的而言......沒有人能回答我的問題,所以我不得不繼續嘗試直到我得到它的工作。 我做到了!
這是我如何使用它的示例:
<?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,請求者 ID 基本上是來自源的 ID 屬性,我在嘗試將其作為對象或變量發送之前已經展示了這一點......我的困惑是我正在嘗試做一個 SOAP調用一個 XML api ......一切都搞砸了 :)
我的英語不太好……但至少我是來展示我的解決方案的。
也許這可以幫助將來的某個人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.