CURL 将 xml 数据发布到 soap service 返回 wsdl XML in php


CURL Post xml data to soap service return wsdl XML in php

我正在尝试使用 curl 请求获取响应。 SOAP 服务在 SOAP 客户端上运行良好。但是使用 Curl 我没有得到正确的响应。

这是我的代码示例:

$bookingRQ = '<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <Interface xmlns="http://api.hotels-vacation.com/Documentation/XML/OTA/4/2011B/" ChannelIdentifierId="HIS_VACATION_XML4H" Version="2011B" Interface="VACATION QUICK CONNECT XML 4 OTA">
            <ComponentInfo User="XMLHISJP" Pwd="5Kh86RSr" ComponentType="Hotel" />
        </Interface>
    </soap-env:Header>
    <soap-env:Body RequestId="201505101528000000001" Transaction="OTA_HotelResRQ">
        <OTA_HotelResRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2012-05-03T15:47:24-04:00" EchoToken="2012-05-03T15:47:24-04:00" Target="Production" Version="1.000" PrimaryLangID="en">
            <HotelReservations>
                <HotelReservation RoomStayReservation="true" CreateDateTime="2012-05-03T15:47:24-04:00">
                    <UniqueID Type="14" ID="HZ10014035" />
                    <RoomStays>
                        <RoomStay>
                            <RoomTypes>
                                <RoomType RoomTypeCode="RR" />
                            </RoomTypes>
                            <RatePlans>
                                <RatePlan RatePlanCode="RPLN">
                                    <MealsIncluded MealPlanCodes="BRE" />
                                </RatePlan>
                            </RatePlans>
                            <RoomRates>
                                <RoomRate NumberOfUnits="1" EffectiveDate="2012-05-13" ExpireDate="2012-05-16" RoomTypeCode="RR" RatePlanCode="RPLN">
                                    <Rates>
                                        <Rate EffectiveDate="2012-05-13" ExpireDate="2012-05-14" RateTimeUnit="Day">
                                            <Base AmountBeforeTax="10000" AmountAfterTax="10980" DecimalPlaces="2" CurrencyCode="USD" />
                                            <Total AmountBeforeTax="10000" AmountAfterTax="10980" DecimalPlaces="2" CurrencyCode="USD" />
                                        </Rate>
                                        <Rate EffectiveDate="2012-05-14" ExpireDate="2012-05-16" RateTimeUnit="Day">
                                            <Base AmountBeforeTax="12000" AmountAfterTax="13050" DecimalPlaces="2" CurrencyCode="USD" />
                                            <Total AmountBeforeTax="24000" AmountAfterTax="26100" DecimalPlaces="2" CurrencyCode="USD" />
                                        </Rate>
                                    </Rates>
                                </RoomRate>
                            </RoomRates>
                            <GuestCounts>
                                <GuestCount AgeQualifyingCode="10" Count="1" />
                                <GuestCount AgeQualifyingCode="8" Count="1" />
                            </GuestCounts>
                            <TimeSpan Start="2012-05-13" End="2012-05-16" />
                            <DepositPayments>
                                <RequiredPayment>
                                    <AcceptedPayments>
                                        <AcceptedPayment RPH="1">
                                            <PaymentCard CardType="1" CardCode="VISA" CardNumber="4321432143214327" ExpireDate="1007" />
                                        </AcceptedPayment>
                                    </AcceptedPayments>
                                    <AmountPercent Amount="130.80" />
                                    <Deadline AbsoluteDeadline="2012-12-15" />
                                </RequiredPayment>
                            </DepositPayments>
                            <BasicPropertyInfo HotelCode="105487" />
                            <ResGuestRPHs>
                                <ResGuestRPH RPH="1" />
                                <ResGuestRPH RPH="2" />
                            </ResGuestRPHs>
                            <SpecialRequests>
                                <SpecialRequest Language="en" RequestCode="114">
                                    <Text Language="en">Honeymoon</Text>
                                </SpecialRequest>
                                <SpecialRequest Language="en" RequestCode="21">
                                    <Text Language="en">Non-Smoking</Text>
                                </SpecialRequest>
                            </SpecialRequests>
                        </RoomStay>
                    </RoomStays>
                    <ResGuests>
                        <ResGuest ResGuestRPH="1" AgeQualifyingCode="10" Age="21">
                            <Profiles>
                                <ProfileInfo>
                                    <Profile ProfileType="1">
                                        <Customer>
                                            <PersonName>
                                                <GivenName>John</GivenName>
                                                <Surname>Dow</Surname>
                                            </PersonName>
                                        </Customer>
                                    </Profile>
                                </ProfileInfo>
                            </Profiles>
                        </ResGuest>
                        <ResGuest ResGuestRPH="2" AgeQualifyingCode="8" age="10">
                            <Profiles>
                                <ProfileInfo>
                                    <Profile ProfileType="1">
                                        <Customer>
                                            <PersonName>
                                                <GivenName>Neil</GivenName>
                                                <Surname>Dow</Surname>
                                            </PersonName>
                                        </Customer>
                                    </Profile>
                                </ProfileInfo>
                            </Profiles>
                        </ResGuest>
                    </ResGuests>
                </HotelReservation>
            </HotelReservations>
        </OTA_HotelResRQ>
    </soap-env:Body>
</soap-env:Envelope>';
$headers = array(
"Cache-Control: no-cache",
"Content-type: text/xml; charset='"utf-8'"",
"Accept: text/xml",
"SOAPAction: '"OTA_HotelResRQ'"",
"Pragma: no-cache",
"Content-length: ".strlen($bookingRQ)
);

$url = 'http://chetu.volateam.com/chetu/push/soapserver/PullService.php?wsdl';
$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, $bookingRQ); 

$result = curl_exec($ch);
$xmlstring = str_replace('soap-env:', '', $result);
$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

我正在获得wsdl XML代码作为响应。我用谷歌搜索它,但我没有找到任何解决方案。我得到的响应如下所述数组。

数组( [@attributes] => 数组 ( [名称] => 拉服务HIS [目标命名空间] => http://chetu.volateam.com/chetu/push/soapserver/PullService.php )

[types] => Array
    (
    )
[portType] => Array
    (
        [@attributes] => Array
            (
                [name] => PullServiceHISPort
            )
        [operation] => Array
            (
                [@attributes] => Array
                    (
                        [name] => OTA_HotelResRQ
                    )
                [documentation] => This method takes XML request and return a string response
                [input] => Array
                    (
                        [@attributes] => Array
                            (
                                [message] => tns:OTA_HotelResRQIn
                            )
                    )
                [output] => Array
                    (
                        [@attributes] => Array
                            (
                                [message] => tns:OTA_HotelResRQOut
                            )
                    )
            )
    )
[binding] => Array
    (
        [@attributes] => Array
            (
                [name] => PullServiceHISBinding
                [type] => tns:PullServiceHISPort
            )
        [operation] => Array
            (
                [@attributes] => Array
                    (
                        [name] => OTA_HotelResRQ
                    )
                [input] => Array
                    (
                    )
                [output] => Array
                    (
                    )
            )
    )
[service] => Array
    (
        [@attributes] => Array
            (
                [name] => PullServiceHISService
            )
        [port] => Array
            (
                [@attributes] => Array
                    (
                        [name] => PullServiceHISPort
                        [binding] => tns:PullServiceHISBinding
                    )
            )
    )
[message] => Array
    (
        [0] => Array
            (
                [@attributes] => Array
                    (
                        [name] => OTA_HotelResRQIn
                    )
                [0] => Array
                    (
                        [@attributes] => Array
                            (
                                [name] => bookingRQ
                                [type] => xsd:string
                            )
                    )
            )
        [1] => Array
            (
                [@attributes] => Array
                    (
                        [name] => OTA_HotelResRQOut
                    )
                [part] => Array
                    (
                        [@attributes] => Array
                            (
                                [name] => return
                                [type] => xsd:string
                            )
                    )
            )
    )

我建议你使用Native PHP SoapClient类。最简单的方法是使用 WSDL 到 php 生成器,它将帮助您对要作为请求发送的结构进行建模。

您还必须知道,OTA 调用起来可能很复杂,并且需要对 rquest 结构有很好的了解。

看看 https://www.wsdltophp.com