簡體   English   中英

用於 sitemider PHP 的 Soap 調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM