2016-02-10 12 views
0

我越來越喜歡在EbxmlMessage指定清議錯誤字符串代碼不存在獲取故障字符串中SABER HOTEL API:在EbxmlMessage規定動作不存在

任何一個可以幫助我,我錯過了什麼。

$OTA_HotelAvailRQ = new stdClass; 
$OTA_HotelAvailRQ->AvailRequestSegment = new stdClass; 
$OTA_HotelAvailRQ->AvailRequestSegment->ReturnHostCommand = true; 
$OTA_HotelAvailRQ->AvailRequestSegment->TimeStamp = '2015-11-12T11:22:06'; 
$OTA_HotelAvailRQ->AvailRequestSegment->Version = '2.2.1'; 

$client = new SoapClient("http://webservices.sabre.com/wsdl/tpfc/OTA_HotelAvailLLS2.2.1RQ.wsdl", [ 
     "trace"  => 1,   
     "exceptions" => 0,   
     "cache_wsdl" => 0 
]); 

$client->__setSoapHeaders(new SoapHeader('NAMESPACE','Auth', [ 
    'UserName'=>'', 
    'Password'=>'', 
    'SystemId'=> [ 
     '_'=>'DATA', 
     'Param'=>'PARAM' 
    ] 
], false)); 

print_r($client->OTA_HotelAvailRQ($OTA_HotelAvailRQ)); 
echo "<p>Request :".htmlspecialchars($client->__getLastRequest()) ."</p>"; 
echo "<p>Response:".htmlspecialchars($client->__getLastResponse())."</p>"; 

回答

1

我看不出有什麼是您所使用的的MessageHeader,但正確的動作不OTA_HotelAvailRQ但OTA_HotelAvail LLS RQ


編輯:

讓我開始通過說只應該在SessionCreate上使用用戶名才能獲得新的會話,那麼您將需要使用返回的BinarySecurityToken。對於相同的環境,這將是有效的,直到會話過期或用SessionClose關閉。讓我們想象我在變量$ bst中有這個。

我已經做了以下不是東西,我可以測試,所以可能會有一些錯誤,再加上,我的PHP知識是非常有限的(記住這一點):)

所以,你需要2個主soap頭文件中的元素,messageHeader和Security。安全性是最簡單的一個,讓我們從這個開始。

安全:

$auth = array(
    'BinarySecurityToken'=>$bst 
); 
$authHeader = new SoapHeader('http://schemas.xmlsoap.org/ws/2002/12/secext','Security',$auth,false); 

的MessageHeader:

$partyId=array(
    'PartyId'=>'' 
); 

$messageData=array(
    'Timestamp'=>date('Y-m-d') 
); 

$messageHeader=array(
    'ConversationId'=>'', 
    'From'=>$partyId, 
    'To'=>$partyId, 
    'CPAId'=>'', 
    'Service'=>'OTA_HotelAvailLLSRQ', 
    'Action'=>'OTA_HotelAvailLLSRQ', 
    'MessageData'=>$messageData 
); 

$messageHeaderHeader = new SoapHeader('http://www.ebxml.org/namespaces/messageHeader','MessageHeader',$messageHeader,false); 

最後加入他們的行列,並設置:

$headers=array(); 
$headers[]=$authHeader; 
$headers[]=$messageHeaderHeader; 

$soap_client->__setSoapHeaders($headers); 
+0

感謝您的答覆 - 當我們打印$ client - > __ getFunctions()時,我們發現WSDL文件的所有可訪問的方法。這裏只顯示OTA_HotelAvailRQ方法。如果我們嘗試訪問OTA_HotelAvailLLSRQ方法,那麼你會得到錯誤 - 「這種方法不是這種服務的有效方法」。 –

+0

請認爲我在PHP方面的知識非常有限。 (0)=>字符串(57)「OTA_HotelAvailRS OTA_HotelAvailRQ(OTA_HotelAvailRQ $ body)」} 因此,OTA_HotelAvailRQ對於身體是正確的。 – Wisdoom

+0

我剛剛意識到的是肥皂頭是「空的」。下面的代碼 $ header = new SoapHeader('NAMESPACE','Auth',$ auth,false); 應該產生一個報頭是這樣的: DATA ns1:Password> 這不是Saber的有效標題,我假設這是它失敗的原因 – Wisdoom