FAQ
1 开始 1.1 开发步骤代理商联系Qunar销售或者运营,说明接入意向,获取open开发平台的用户名和密码。
参考平台上标准开发文档,进行开发,可以使用此开发平台的自测工具进行测试。
请按照文档下方case进行测试,保证测试case正常运行。
case测试通过后,使用待上线正式数据在open平台进行最后一次测试,准备上线。
联系Qunar销售客服,上线一个酒店,Qunar协助代理商在线上测试完整业务流程;并安排培训上线后续事宜。
1.2 重要说明所有的API接口, Content-Type 只能为文本类型,如 Content-Type="text/xml"。请解压缩gzip文件。
所有的API接口, charset 只能为 UTF-8。
所有的API接口,请不要忘记xml声明 <?xml version="1.0" encoding="utf-8"?>。
所有的API接口,在传输特殊字符(如:&、<、>、‘、“)时,请对特殊字符进行转义。
1.3 预订过程接入去哪儿的代理商需先了解去哪儿网搜索预订逻辑,以便更好的理解接口文档,建议下载"去哪儿旅行"APP,以更好的了解预订过程及方便后续的线上验证。
因设备及版本不同,以下示例图片仅供参考。
预订过程酒店搜索页–>酒店列表页–>酒店详情页–>酒店订单页->支付以及订单确认等操作
Hotel Search –> Hotel List –> Hotel Detail –>Hotel Booking->Pay/Order Confirm ..
1) 酒店搜索页(Search页)打开“去哪儿旅行”APP,点击海外酒店频道,进入【酒店搜索页】;

指定入参:目的地、入离日期、成人/儿童数、关键字。点击 开始搜索,进入【酒店列表页】。


指定入参:入离日期、成人/儿童数、关键字,点击【确定】,可以刷新酒店报价列表。
数据来源:Qunar本地缓存或实时抓取;代理商可以在Quanr配置缓存时间,若不配置,系统默认时间为6小时;当刷新报价时,若代理商报价未过期则使用缓存报价,若报价过期则实时抓取指定入离日期、成人/儿童数的报价;代理商可通过缩短缓存时间或配置实时抓取来降低变价率,具体配置方式,请与Quanr销售或运营沟通;
选中酒店,进入【酒店详情页】。


酒店信息:展示Qunar维护的酒店图片、房型图片、酒店亮点、介绍、设施、酒店政策、交通和周边、点评信息等信息。
Qunar房型-代理商房型:一个Qunar房型对应多个代理商房型报价。


点击预订按钮,可进入【订单填写页】。

指定入参:入住日期、离店日期、成人/儿童数。变更参数,点击 确定,可以刷新酒店报价数据。
数据来源:Qunar本地缓存或实时抓取;代理商可以在Quanr配置缓存时间,若不配置,系统默认时间为6小时;当刷新报价时,若代理商报价未过期则使用缓存报价,若报价过期则实时抓取指定入离日期、成人/儿童数的报价;代理商可通过缩短缓存时间或配置实时抓取来降低变价率,具体配置方式,请与Quanr销售或运营沟通;


指定入参:酒店、房型、入离日期、成人/儿童数、房间数。
消费者在此页面可变更间数,不可变更酒店、房型、入离日期、成人/儿童数。
数据来源:此页面报价均为实时获取,Detail页→Booking页的过程称为进订,若出现变价或超时可能导致进订失败;
点击提交订单按钮,进入支付页面;
特别说明:
响应时间超长(10s超时),则会预订失败,这将严重影响用户体验。

在消费者支付之后,Qunar会向代理商一侧发起下单请求。
消费者取消订单时,Qunar会向代理商一侧发起取消请求。
2 数据接口国际酒店标准接口基础数据主要包含两部分:酒店基础数据(代理商提供)和报价接口数据(代理商提供)。
2.1 酒店基础数据(代理商提供)Qunar通过调用此接口,获得代理商的酒店列表。
数据用途:用于代理商和Qunar的酒店信息映射,实现代理商酒店和Qunar酒店的聚合。
更新方式:全量,不支持增量,不支持分页。
更新时间:每天凌晨自动更新。亦可以通过人工处理。
更新限制:酒店一次性减少3/4,或者减少超过1000家,只能通过人工处理。
如果不能完成酒店聚合,请参照上对应的酒店名称、酒店地址,并更正【酒店基础数据】接口提供的酒店名称、酒店地址,以实现聚合。
2.1.1 requestHTTP URL:https://base_url
HTTP Param:无要求
HTTP Method:GET
URL由代理商提供,在Qunar端进行配置。
base_url由代理商提供,代理商可以附加参数,用于识别请求来源。
示例
https://test.hotel.com?source=Qunar
https://test.hotel.com
两者都可以。
以下接口中涉及的base_url,均可参照此解释。
2.1.2 response<?xml version="1.0" encoding="utf-8"?>
<list>
<hotel id="58283" tel="82-2-771-0500" address="87, Sogong-dong, Jung-gu, Seoul, Korea (100-070) (106, Sogong-ro, Jung-gu, Seoul)" name="The Westin Chosun Seoul" nameCN="首尔威斯汀朝鲜酒店" city="seoul" coordinateProvider="1" longitude="139.44468" latitude="35.54667" hotelRelationships="ctrip:123, expedia:8888, booking:3333"></hotel>
<hotel id="58284" tel="82-2-7711000" address="30, Eulji-ro, Jung-gu, Seoul(EX.1, Sogong-dong, Jung-gu, Seoul, Korea)" name="LOTTE HOTEL SEOUL" nameCN="首尔乐天饭店" city="seoul" coordinateProvider="1" longitude="139.44468" latitude="35.54667" hotelRelationships="ctrip:123, expedia:8888, booking:3333"></hotel>
<hotel id="58285" tel="02-771-2200" address="119, Sogong-ro, Jung-gu, Seoul" name="THE PLAZA HOTEL" nameCN="首尔广场傲途格精选酒店" city="seoul" coordinateProvider="1" longitude="139.44468" latitude="35.54667" hotelRelationships="ctrip:123, expedia:8888, booking:3333"></hotel>
<hotel id="58286" tel="82-2-2233-3131" address="249, Dongho-ro, Jung-gu, Seoul" name="THE SHILLA SEOUL" nameCN="首尔新罗酒店" city="seoul" coordinateProvider="1" longitude="139.44468" latitude="35.54667" hotelRelationships="ctrip:123, expedia:8888, booking:3333"></hotel>
<hotel id="58287" tel="82-2-3216-5656" address="353, Yeonhui-ro, Seodaemun-gu, Seoul" name="GRAND HILTON SEOUL HOTEL" nameCN="首尔希尔顿大酒店" city="seoul" coordinateProvider="1" longitude="139.44468" latitude="35.54667" hotelRelationships="ctrip:123, expedia:8888, booking:3333"></hotel>
...
</list>
Qunar通过调用此接口,获得指定酒店的报价信息,报价信息包括房型基本属性、房价、房态、房量等。
发生时间:
Search页→List页、List页→Detail页、Detail页→Booking页、Booking页→Pay/Order Confirm
请求区别:
1)无roomId参数:Search页→List页、List页→Detail页;
2)有roomId参数:Detail页→Booking页、Booking页→Pay/Order Confirm;
3)成人/儿童参数:若报价请求无成人/儿童参数(默认配置),请返回所有人数的可用报价;如无法返回全量报价,请通过您的商务经理联系Qunar端进行配置,改为按用户真实人数请求配置,此策略会按照用户真实请求抓取报价
2.2.1 requestHTTP URL:https://base_url?xml=xxx
HTTP Param:xml
HTTP Method:GET
说明: base_url由代理商提供,Qunar端进行配置。代理商可以附加参数,用于识别请求来源。
base_url示例:
https://test.hotel.com?source=Qunar
https://test.hotel.com
完整示例:
https://test.hotel.com?source=Qunar&xml=xxx
https://test.hotel.com?xml=xxx
参数xml示例:
<?xml version="1.0" encoding="utf-8"?> <priceRequest> <hotelId>16166</hotelId> <checkin>2019-09-13</checkin> <checkout>2019-09-14</checkout> <roomId>199</roomId><!-- only appears at order filling page --> <numberOfRooms>2</numberOfRooms> <customerInfos> <customerInfo seq="0" numberOfAdults="2" numberOfChildren="2" childrenAges="8|12" > </customerInfo> <customerInfo seq="1" numberOfAdults="2" numberOfChildren="0" childrenAges="" > </customerInfo> </customerInfos> </priceRequest> urlDecode编码之后的参数示例(参数已编码,请先解码再解析) "https://hotel-s.oneworldtrip.cn/qunar/shkqrj03p3/api/hotel/search?xml=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22+standalone%3D%22yes%22%3F%3E%0A%3CpriceRequest%3E%0A++++%3ChotelId%3E10P410000206%3C%2FhotelId%3E%0A++++%3Ccheckin%3E2022-03-18%3C%2Fcheckin%3E%0A++++%3Ccheckout%3E2022-03-19%3C%2Fcheckout%3E%0A++++%3CnumberOfRooms%3E1%3C%2FnumberOfRooms%3E%0A++++%3CcrawlSource%3Eremote%3C%2FcrawlSource%3E%0A%3C%2FpriceRequest%3E%0A"
字段 含义 类型 可选/必选 可为空 说明<?xml version="1.0" encoding="utf-8"?> <priceResponse hotelId="9987" hotelName="Toyoko Inn Tokyo Machida-eki Odakyu-sen Higashi-guchi" hotelNameCN="东京东横町田站东口小田急森酒店" hotelAddress="1-3-3, Naka-machi, Machida-city, Tokyo" hotelPhone="0081-42-7281045" coordinateProvider="1" longitude="139.44468" latitude="35.54667" checkin="2019-09-13" checkout="2019-09-14" currencyCode="USD" > <rooms> <!-- one or more <room> --> <room id="P_1" physicRoomId=7572685 name="Double(breakfast)" nameCN="标准房(含早)"payType="PREPAY" prices="200|200" status="ACTIVE|DISABLED" counts="5|5" roomRate="180|180" taxAndFee="20|20" broadband="FREE" maxOccupancy="2" occupancyNumber="2" freeChildrenNumber="1" freeChildrenAgeLimit="8" instantConfirmRoomCount="3|3" wifi="FREE" window="1" checkinTime="12:00" checkoutTime="12:30" area="" guestType="ALL_GUEST" payUponArrivalTax="YES" > <!-- constraint: for each day prices = roomRate + taxAndFee --> <bookingRule userProperty="101,102,103,111"ipLimitType="1" locationType="1" weeklyIndex="0000011" start="10"end="23"visible="true"ip="1" > <bookingTime maxAdvanceDays="8" minAdvanceDays="2" minAdvanceHours="6" last="2" maxLast="3" /> </bookingRule> <customerLimit regionLimit="1" regions="CHN,TWN"/> <bedType> <beds code="DOUBLE" desc="大床" count="1" size="1.8m*2m" > </beds> </bedType> <meal> <breakfast count="2|2" desc="日式早餐" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal> <refund returnable="true" timeZone="GMT+9" > <!-- timeZone --> <refundRules> <refundRule before="29" type="DEDUCT_BY_AMOUNT" value="50" /> <refundRule before="25" type="DEDUCT_BY_PERCENT" value="70" /> </refundRules> </refund> <remarks><!-- optional --> <remark seq="1" value="the weather will be rainy in July, please prepare rain gears by yourself"/> <remark seq="2" value="no pets allowed please"/> <remark seq="3" value="free parking, but cannot make sure available parking lots any time"/> </remarks> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> <taxes><!-- optional --> <tax id="51" type="IncludedInTotalPrice" amount="100|100" currency="CNY" /> </taxes> </room> </rooms> </priceResponse>
如果没有相应报价数据,请返回空节点<priceResponse/>
priceResponse
字段 含义 类型 可选/必选 可为空 说明room节点属性
字段 含义 类型 可选/必选 可为空 说明以下节点为room子节点,如<bookingRule>、<bedType>、<meal>、<refund>、<remarks>、<guaranteeRules>、<customerLimit>。
bookingRule节点属性*(bookingRule是room的可选节点)限制报价展示条件。
<bookingRule userProperty="101,102,103" ip="1" > <bookingTime maxAdvanceDays="8" minAdvanceDays="2" minAdvanceHours="6" last="2" maxLast="3" /> </bookingRule>
字段 含义 类型 可选/必选 可为空 说明有时一个酒店对同一个房型可以提供不同的床型。例如下面的例子提供了两种床型。
否则只需要一个<beds>节点即可.
<bedType relation="OR" > <beds seq="1" code="SINGLE" desc="单人床" count="2" size="1.2m*2m" > </beds> <beds seq="2" code="DOUBLE" desc="大床" count="1" size="1.8m*2m" > </beds> </bedType>
字段 含义 类型 可选/必选 可为空 说明请提供breakfast。
<meal> <breakfast count="2|2" desc="self-service breakfast" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal>
字段 含义 类型 可选/必选 可为空 说明如果无此节点则意味着消费者在Qunar不可退订。
<refund returnable="true" timeZone="GMT+9" > <!-- 增加timeZone --> <refundRules> <refundRule before="130" type="NO_DEDUCTION" value="0" /> <refundRule before="36" type="DEDUCT_BY_AMOUNT" value="20" /> <refundRule before="25" type="DEDUCT_BY_PERCENT" value="30" /> </refundRules> </refund>
以上可按照解析规则翻译为(假设checkIn = 2019-09-25 checkOut = 2019-10-02)
before type value 含义特别说明:现在生产环境逻辑,退款规则只保留三段:免费取消、部分退款(解析为一段)、全额扣款。
部分退款(解析为一段)的示例:
代理商一侧提供的退款规则: <refundRule before="36" type="DEDUCT_BY_AMOUNT" value="20" /> <refundRule before="25" type="DEDUCT_BY_PERCENT" value="30" /> Qunar现有逻辑合并为 : <refundRule before="36" type="DEDUCT_BY_PERCENT" value="30" />
remarks节点属性*(remarks是room的可选节点)预订提示信息。
<remarks><!-- optional --> <remark seq="1" value="the weather will be rainy in July, please prepare rain gears by yourself"/> <remark seq="2" value="no pets allowed please"/> <remark seq="3" value="free parking, but cannot make sure available parking lots any time"/> </remarks>
字段 含义 类型 可选/必选 可为空 说明宾客国籍限制
字段 含义 类型 可选/必选 可为空 说明<extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> <property key="EAN" value="XXXYYY" /> <property key="BK" value="XXXYYY" /> <property key="AGODA" value="XXXYYY" /> <property key="ELONG" value="XXXYYY" /> <property key="GCTRIP" value="XXXYYY" /> </extras>
字段 含义 类型 可选/必选 可为空 说明有时代理商需要在<room>节点附加额外的信息,在预订(<bookingRequest>中)时可回传此信息。
taxes节点属性*(taxes是room的可选节点)<taxes><!-- optional --> <tax id="51" type="IncludedInTotalPrice" amount="100|100" currency="CNY" /> </taxes>
字段 含义 类型 可选/必选 可为空 说明Qunar通过调用此接口,获得多个酒店的报价信息。(此接口目前Q已不接入,无需开发)
2.3.1 requestHTTP URL:https://base_url?xml=xxx
HTTP Param:xml
HTTP Method:GET
响应时间:不超过30s
URL由代理商提供,在Qunar端进行配置。 HTTP必要参数只有一个即xml。例如
<?xml version="1.0" encoding="utf-8"?> <priceRequest> <hotelIds>9987,9988</hotelIds> <hotelCity>tokyo</hotelCity> <checkin>2019-09-13</checkin> <checkout>2019-09-14</checkout> <numberOfRooms>2</numberOfRooms> <customerInfos> <customerInfo seq="0" numberOfAdults="2" numberOfChildren="2" childrenAges="8|12" > </customerInfo> <customerInfo seq="1" numberOfAdults="2" numberOfChildren="0" childrenAges="" > </customerInfo> </customerInfos> </priceRequest>
字段 含义 类型 可选/必选 可为空 说明如果没有相应报价数据,请返回空节点<list/>。
字段含义与【报价接口数据-单酒店】保持一致。
<?xml version="1.0" encoding="utf-8"?> <list> <priceResponse hotelId="9987" hotelCity="tokyo" hotelName="Toyoko Inn Tokyo Machida-eki Odakyu-sen Higashi-guchi" hotelNameCN="东京东横町田站东口小田急森酒店" hotelAddress="1-3-3, Naka-machi, Machida-city, Tokyo" hotelPhone="0081-42-7281045" coordinateProvider="1" longitude="139.44468" latitude="35.54667" checkin="2015-02-20" checkout="2015-02-22" currencyCode="USD" > <rooms> <!-- one or more <room> --> <room id="P_1" name="Double(breakfast)" nameCN="标准房(含早)" payType="PREPAY" prices="200|200" status="ACTIVE|DISABLED" counts="5|5" roomRate="180|180" taxAndFee="20|20" broadband="FREE" maxOccupancy="2" occupancyNumber="2" freeChildrenNumber="1" freeChildrenAgeLimit="8" instantConfirmRoomCount="3|3" wifi="FREE" window="1" checkinTime="12:00" checkoutTime="12:30" area="" guestType="ALL_GUEST" > <!-- constraint: for each day prices = roomRate + taxAndFee --> <bookingRule userProperty="101,102,103" ip="1" > <bookingTime maxAdvanceDays="8" minAdvanceDays="2" minAdvanceHours="6" /> </bookingRule> <bedType> <beds seq="1" code="DOUBLE" desc="大床" count="1" size="1.8m*2m" > </beds> </bedType> <meal> <breakfast count="2|2" desc="日式早餐" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal> <refund returnable="true" timeZone="GMT+9" > <!-- timeZone --> <refundRules> <refundRule before="29" type="DEDUCT_BY_AMOUNT" value="50" /> <refundRule before="25" type="DEDUCT_BY_PERCENT" value="70" /> </refundRules> </refund> <remarks><!-- optional --> <remark seq="1" value="the weather will be rainy in July, please prepare rain gears by yourself"/> <remark seq="2" value="no pets allowed please"/> <remark seq="3" value="free parking, but cannot make sure available parking lots any time"/> </remarks> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> </room> </rooms> </priceResponse> <priceResponse hotelId="9988" hotelName="Toyoko Inn Tokyo Machida-eki Odakyu-sen Higashi-guchi" hotelNameCN="东京东横町田站东口小田急森酒店" hotelAddress="1-3-3, Naka-machi, Machida-city, Tokyo" hotelPhone="0081-42-7281045" coordinateProvider="1" longitude="139.44468" latitude="35.54667" checkin="2019-09-13" checkout="2019-09-14" currencyCode="USD" > <rooms> <!-- one or more <room> --> <room id="P_2" name="Double(breakfast)" nameCN="标准房(含早)" payType="PREPAY" prices="200|200" status="ACTIVE|DISABLED" counts="5|5" roomRate="180|180" taxAndFee="20|20" broadband="FREE" maxOccupancy="2" occupancyNumber="2" freeChildrenNumber="1" freeChildrenAgeLimit="8" instantConfirmRoomCount="3|3" wifi="FREE" window="1" checkinTime="12:00" checkoutTime="12:30" area="" guestType="ALL_GUEST" > <!-- constraint: for each day prices = roomRate + taxAndFee --> <bookingRule userProperty="101,102,103" ip="1" > <bookingTime maxAdvanceDays="8" minAdvanceDays="2" minAdvanceHours="6" /> </bookingRule> <bedType> <beds seq="1" code="DOUBLE" desc="大床" count="1" size="1.8m*2m" > </beds> </bedType> <meal> <breakfast count="2|2" desc="日式早餐" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal> <refund returnable="true" timeZone="GMT+9" > <!-- timeZone --> <refundRules> <refundRule before="29" type="DEDUCT_BY_AMOUNT" value="50" /> <refundRule before="25" type="DEDUCT_BY_PERCENT" value="70" /> </refundRules> </refund> <remarks><!-- optional --> <remark seq="1" value="the weather will be rainy in July, please prepare rain gears by yourself"/> <remark seq="2" value="no pets allowed please"/> <remark seq="3" value="free parking, but cannot make sure available parking lots any time"/> </remarks> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> </room> </rooms> </priceResponse> </list>
2.4 代理商变价推送接口(Qunar提供)代理商酒店有变价,主动推送变价消息给去哪儿,去哪儿接收到变价消息后去代理商抓取变价信息
2.4.1 requestHTTP URL:https://ghota.qunar.com/ota/changeprice/gnorm/param/push
HTTP Method:POST
响应时间:不超过10s
接口参数示例如下
字段说明:
字段 含义 类型 可选/必选 可为空 说明接口返回值示例如下
{ "status": 0}
{ "status": 1, "errorCode" "0002", "errorMsg": "hmac码异常" }
字段说明:
字段 含义 类型 说明在消费者支付完成后,Qunar会向代理商一侧发起预订请求。 每次预订只能指定一个房型。
3.1.1 requestHTTP URL:https://base_url
HTTP Param:xml
HTTP Method:POST
Connection Timeout:响应时间不超过10s
HTTP ContentType:x-www-form-urlencode
URL由代理商提供,在Qunar端进行配置。
<?xml version="1.0" encoding="utf-8"?> <bookingRequest> <hotelId>16166</hotelId> <checkin>2019-09-13</checkin> <checkout>2019-09-14</checkout> <totalPrice>800</totalPrice><!-- totalPrices = sum(prices) * numberOfRooms --> <currencyCode>USD</currencyCode> <rmbPrice>5504</rmbPrice> <totalPriceAfterPromotion>5500</totalPriceAfterPromotion> <promotionPrice>4</promotionPrice> <customerArriveTime>16:00-18:00</customerArriveTime> <specialRemarks>PREFER_NON_SMOKING,PREFER_HIGH_FLOOR</specialRemarks> <!-- preference from consumer --> <numberOfRooms>2</numberOfRooms> <bedChoice>1</bedChoice> <instantConfirm>false</instantConfirm> <requiredAction>CONFIRM_ROOM_SUCCESS/CONFIRM_ROOM_FAILURE</requiredAction> <specialRemarks>Room 1:Guest 1 - YANG/CHENG,Guest 2 - XU/CHUBO;Room 2:Guest 1 - ZHANG/LUPING,Guest 2 - WANG/XIAOLAN;need smoking room,need adjoining rooms,need quiet room,need high floor room尽量安排吸烟房,尽量安排相近房间,尽量安排安静房间,尽量高层</specialRemarks> <room id="9986" name="特色房" broadband="FREE" payType="PREPAY" prices="200|200" status="ACTIVE|ACTIVE" counts="5|5" roomRate="180|180" taxAndFee="20|20" maxOccupancy="2" occupancyNumber="2" freeChildrenNumber="1" freeChildrenAgeLimit="8" instantConfirmRoomCount="3|3" wifi="FREE" checkinTime="" checkoutTime="" area="" guestType="ALL_GUEST" > <bedType> <beds seq="1" code="SINGLE" desc="单人床" count="2" size="1.2m*2m" > </beds> </bedType> <meal> <breakfast count="2|2" desc="self-service breakfast" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal> <promotionRules> <promotionRule code="FREE_UPGRADE" desc="免费升级" value="0"></promotionRule> </promotionRules> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> </room> <customerInfos> <customerInfo seq="0" numberOfAdults="2" numberOfChildren="2" childrenAges="8|12" > <customer firstName="Ziqiang" lastName="Deng" nationality="CN" gender="male" /> </customerInfo> <customerInfo seq="1" numberOfAdults="2" numberOfChildren="0" childrenAges="" > <customer firstName="XoXo" lastName="Li" nationality="CN" gender="male" /> </customerInfo> </customerInfos> <qunarOrderInfo> <orderNum>j3gm141219163017759</orderNum><!-- unique order id at Qunar --> <hotelSeq>osaka_2202</hotelSeq><!-- unique id for a hotel at Qunar --> <hotelName>阪急阪神大阪国际酒店(Hotel Hankyu International)</hotelName> <hotelAddress>19-19, Chayamachi, Kita-ku, Osaka 530-0013, Japan</hotelAddress> <cityName>大阪</cityName> <hotelPhone>0081-6-63772100</hotelPhone> <orderDate>2014-12-19 16:30:17</orderDate> <contactName>张三</contactName> <contactPhone>1381****818</contactPhone> <contactEmail>miao.****@Qunar.com</contactEmail> <payType>PREPAY</payType> <customerIp>103.24.27.9</customerIp> <!-- N=no require Y=paper invoice E=electronic receipt --> </qunarOrderInfo> </bookingRequest>
<room>节点相关信息来自代理商提供的报价信息。
<customerInfos>为顾客信息。
<qunarOrderInfo>包含了本次预订的部分订单信息。
字段 含义 类型 可选/必选 可为空 说明<?xml version="1.0" encoding="utf-8"?> <bookingResponse> <qunarOrderNum>j3gm141219163017759</qunarOrderNum> <orderId>9987654</orderId> <result>SUCCESS</result> <msg></msg> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> </bookingResponse>
字段说明:
字段 含义 类型 可选/必选 可为空 说明有时代理商未提供即时确认房,代理商需要调用此接口以确认此预订是否成功。
使用订单操作接口的代理商需通知Qunar运营配置代理商的IP白名单。
3.2.1 requestHTTP URL:https://sub_domain/api/ota/otaOpt?orderNum=xxx&hmac=xxx&opt
HTTP Param:orderNum、hmac、opt
HTTP Method:POST
sub_domain、signKey由Qunar指定,供代理商使用。代理商访问此地址时有IP和signKey限制。
Beta环境(open平台)测试时,测试方式请参照open平台操作手册。
字段 含义 类型 可选\必选 可为空 说明hmac 示例
package com.qunar.test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; public class MyHmacUtil { public static byte[] hashMD5(String str) { return (str == null) ? null : hashMD5(str.getBytes()); } public static byte[] hashMD5(byte[] bytes) { try { return hash("MD5", bytes); } catch (NoSuchAlgorithmException e) { return null; // can't happen } } public static byte[] hash(String algorithm, byte[] bytes) throws NoSuchAlgorithmException { if (algorithm == null || bytes == null) { return null; } MessageDigest md = MessageDigest.getInstance(algorithm.toUpperCase()); return md.digest(bytes); } public static String toHexString(byte[] byteArray, String delim) { if (delim == null) { delim = ""; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < byteArray.length; i++) { if (i > 0) { sb.append(delim); } String hex = Integer.toHexString(byteArray[i] & 0x00ff).toLowerCase(); if (hex.length() < 2) { sb.append("0"); } sb.append(hex); } return sb.toString(); } public static String toHexString(byte[] byteArray) { return toHexString(byteArray, null); } public static String getHmac(List<String> params) { StringBuffer buf = new StringBuffer(""); for (String param : params) { buf.append(param); } return toHexString(hashMD5(buf.toString())); } }
3.2.2 response{ "statusCode": 6, "ret": true, "statusDesc": "订单取消" }
{ "statusCode": 6, "ret": false, "errorMsg": ["订单当前状态不满足对应操作"], "statusDesc": "订单取消" }
字段说明:
字段 含义 类型 可选/必选 可为空 说明消费者取消预订时,需要调用订单取消接口。
关于已确认订单的取消逻辑:
消费者在订单详情页取消订单时,Qunar保证退款符合代理商房型报价的退款规则。
有时退款规则不允许取消预订,则可以通过Qunar后台进行强制取消,并通知代理商。。
关于订单取消:
现阶段,Qunar不支持订单修改,消费者必须先取消先前订单,然后再重新做一次预订。
另外, 一个<cancelRequest>请求意味着取消的是整个订单,Qunar不支持取消订单的部分间夜。
3.3.1 requestHTTP URL:https://base_url
HTTP Param:xml
HTTP Method:POST
Connection Timeout:3s, Request Timeout: 100s
base_url由代理商提供,在Qunar端配置。
<?xml version="1.0" encoding="utf-8"?> <cancelRequest> <qunarOrderNum>j3gm141219163019999</qunarOrderNum> <orderId>9987654</orderId> <requiredAction>AGREE_UNSUBSCRIBE/REFUSE_UNSUBSCRIBE</requiredAction> <reason></reason> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="OTHER_KEY" value="XXXYYY" /> </extras> </cancelRequest>
字段 含义 类型 可选\必选 否可为空 备注<?xml version="1.0" encoding="utf-8"?> <cancelResponse> <qunarOrderNum>j3gm141219163017759</qunarOrderNum> <orderId>9987654</orderId> <result>SUCCESS</result> <msg></msg> </cancelResponse>
字段说明:
字段 含义 类型 可选/必选 可为空 说明在Qunar调用代理商预订接口时如果发生异常,Qunar需要在重试前,携带去哪儿订单号访问此接口以确认代理商是否生单成功。
3.4.1 requestHTTP URL:https://base_url
HTTP Param:xml
HTTP Method:GET
Connection Timeout:3s, Request Timeout: 10s
base_url由代理商提供,在Qunar端配置。
<?xml version="1.0" encoding="utf-8"?> <wrapperOrderQueryRequest> <qunarOrderNum>j3gm141219163017759</qunarOrderNum><!-- require --> <orderId>12345678</orderId><!-- orderId optional --> <extras><!-- optional --> <property key="TOKEN" value="ASDFJJJJ9999XXXXYYY" /> <property key="EAN" value="XXXYYY" /> <property key="BK" value="XXXYYY" /> <property key="AGODA" value="XXXYYY" /> <property key="ELONG" value="XXXYYY" /> <property key="HB" value="XXXYYY" /> <property key="GCTRIP" value="XXXYYY" /> </extras> </wrapperOrderQueryRequest>
字段 含义 类型 可为空 说明代理商需要返回所有bookingRequest中含有的所有节点信息。
如果没有相应订单数据,请返回空节点<wrapperOrderQueryResponse/>。
<?xml version="1.0" encoding="utf-8"?> <wrapperOrderQueryResponse> <orderInfo> <orderNum>j3gm141219163017759</orderNum><!-- unique order id at Qunar --> <orderId>9987654</orderId><!-- unique order id at wrapper --> <payType>PREPAY</payType> <status>CONFIRMED_SUCCESS</status> <hotelSeq>osaka_2202</hotelSeq><!-- unique id for a hotel at Qunar --> <hotelName>阪急阪神大阪国际酒店(Hotel Hankyu International)</hotelName> <hotelAddress>19-19, Chayamachi, Kita-ku, Osaka 530-0013, Japan</hotelAddress> <cityName>大阪</cityName> <hotelPhone>0081-6-63772100</hotelPhone> <orderDate>2014-12-19 16:30:17</orderDate> <contactName>张三</contactName> <contactPhone>1381****818</contactPhone> <contactEmail>miao.****@Qunar.com</contactEmail> <customerIp>103.24.27.9</customerIp> <invoiceCode>E</invoiceCode><!-- N不需要 Y纸质收据 E电子收据 --> <invoice type="" title="somebody" content="" dispatch="" contactName="" contactPhone="" province="" city="" area="" detailAddress="" fee="" /> <hotelId>16166</hotelId> <checkin>2014-12-29</checkin> <checkout>2014-12-30</checkout> <totalPrice>380</totalPrice><!-- totalPrices = sum(prices) * numberOfRooms --> <currencyCode>USD</currencyCode> <totalPriceAfterPromotion>370</totalPriceAfterPromotion><!-- totalPrices = sum(prices) * numberOfRooms --> <promotionPrice>10</promotionPrice> <room id="9987" prices="200|200" roomRate="180|180" taxAndFee="20|20" > <bedType> <beds seq="1" code="5" desc="单人床" count="2" size="" /> <beds seq="2" code="0" desc="大床" count="1" size="" /> </bedType> <meal> <breakfast count="2|2" desc="self-service breakfast" /> <lunch count="0|0" desc="" /> <dinner count="0|0" desc="" /> </meal> <promotionRules> <promotionRule code="FREE_UPGRADE" desc="免费升级" value="0"></promotionRule> </promotionRules> </room> <customerArriveTime>16:00-18:00</customerArriveTime> <specialRemarks>PREFER_NON_SMOKING,PREFER_HIGH_FLOOR</specialRemarks> <customerInfos> <customerInfo seq="0" numberOfAdults="2" numberOfChildren="2" childrenAges="8|12" > <customer firstName="Ziqiang" lastName="Deng" nationality="CN" gender="male" /> </customerInfo> <customerInfo seq="1" numberOfAdults="2" numberOfChildren="0" childrenAges="" > <customer firstName="XoXo" lastName="Li" nationality="CN" gender="male" /> </customerInfo> </customerInfos> </orderInfo> </wrapperOrderQueryResponse>
3.4.3 重要说明-订单状态 enum value description特别说明:对于未确认可住的订单,消费者联系方式均打了马赛克。
3.5.1 requestHTTP URL:https://sub_domain/api/ota/qunarOrderQuery?orderNums=xxx&hmac=xxx
HTTP Param:orderNums、hmac
HTTP Method:GET
sub_domain由Qunar指定,代理商访问时有IP和signKey限制。
字段 含义 类型 可选\必选 可为空 说明<?xml version="1.0" encoding="utf-8"?> <qunarOrderQueryResponse> <orderInfo> <orderNum>j3gm141219163017759</orderNum><!-- unique order id at Qunar --> <orderId>9987654</orderId><!-- unique order id at wrapper --> <payType>PREPAY</payType> <qunarStatus>CONFIRMED_SUCCESS</qunarStatus> <roomNum>2</roomNum> <cityName>大阪</cityName> <hotelSeq>osaka_2202</hotelSeq> <hotelName>阪急阪神大阪国际酒店(Hotel Hankyu International)</hotelName> <hotelAddress>19-19, Chayamachi, Kita-ku, Osaka 530-0013, Japan</hotelAddress> <hotelPhone>0081-6-63772100</hotelPhone> <orderDate>2014-12-19 16:30:17</orderDate> <contactName>张三</contactName> <contactPhone>1381****818</contactPhone> <contactEmail>miao.miao@Qunar.com</contactEmail> <customerIp>103.24.27.9</customerIp> <invoiceCode>E</invoiceCode><!-- N不需要 Y纸质收据 E电子收据 --> <hotelId>16166</hotelId> <checkin>2014-12-29</checkin> <checkout>2014-12-30</checkout> <roomId>1010162|327223</roomId> <currencyCode>USD</currencyCode> <totalPriceAfterPromotion>5500</totalPriceAfterPromotion> <promotionPrice>4</promotionPrice> <customerArriveTime>16:00-18:00</customerArriveTime> <specialRemarks>PREFER_NON_SMOKING,PREFER_HIGH_FLOOR</specialRemarks> <customerInfos> <customerInfo seq="0" numberOfAdults="2" numberOfChildren="2" childrenAges="8|12" > <customer firstName="Ziqiang" lastName="Deng" nationality="CN" gender="male" /> </customerInfo> <customerInfo seq="1" numberOfAdults="2" numberOfChildren="0" childrenAges="" > <customer firstName="XoXo" lastName="Li" nationality="CN" gender="male" /> </customerInfo> </customerInfos> </orderInfo> <orderInfo> ... </orderInfo> </qunarOrderQueryResponse>
4. 枚举类型 4.1 BedType 字段 说明请使用供应商开发平台,平台账号请通过对应Qunar产品人员或运营人员索取。-
7 FAQ 问题1:酒店列表的更新频率?通常每天更新一次,也可以手工触发,如果你需要更新大量酒店信息,请联系相关人员。
问题2:酒店聚合问题?去哪儿同步代理商的酒店后,会将其聚合到去哪儿的基础酒店上。
部分酒店聚合不了通常原因是酒店名称,地址等超长或者不合法,
如果出现聚合问题,可以先在open平台,进行排查。
如仍有问题,请联系相关运营人员。
问题3:不展示报价?代理商请先确认酒店是否已经聚合成功,然后在open测试平台测试报价是否符合要求,,如果都没有问题,请联系Qunar相关运营人员进行解决。
问题4: 进订率问题?进订成功率是指: 用户点击预订进入订单填写页的成功次数/总进订次数,不包括进入订单填写页后改变入住时间,房间数目等报价请求。 如果代理商的进订成功率低于平均80%会进行下线处理,所以在此环节代理商需避免超时,无报价的情况发生。
问题5:产品已下线?代理商订单页报价响应超时(超过10s)或代理商确实无房。
问题6:拒单?通常是以下三种情况:
代理商确认无房。
Qunar向代理商下单,调用代理商订单预订接口失败(网络异常等)。
Qunar向代理商下单前,进行报价校验,查询报价失败。