攜程分銷聯盟提供酒店、機票、團購、度假幾大旅游產品分銷接口;本系列主要研究度假相關接口。
接口文檔下載地址:http://open.ctrip.com/help/CommonParams2.aspx?belong=CooperationMode&pagename=CommonParams2
度假接口最主要的兩個接口是:
- PkgProductSearch 產品搜索
- ProductInfoSearch 產品信息查詢
其它接口都是關於度假接口相關基礎資料。
-------------------------------------------------------------------------------------------------------------------------------------------
本文首先研究“景區信息”實現接口的例子:
接口說明
API_Url |
API服務的域名地址 |
聯系商務經理獲取(http://openapi.ctrip.com) |
AllianceID |
分銷商ID |
可以從u.ctrip.com上注冊后獲取 |
SID |
站點ID |
可以從u.ctrip.com上注冊后獲取 |
TimeStamp |
從1970年到現在的秒數 |
|
RequestType |
請求接口的類型 |
|
Signature |
MD5加密串 |
可以通過《技術資料》獲取幫助支持 |
接口地址
http://openapi.ctrip.com/vacations/OpenServer.ashx
調用方式
參數:RequestJson=UrlEncode(請求報文)
例:
請求報文格式
報文最外層使用json格式,字段RequestBody中根據不同需要,使用XML或JSON。
RequestJson格式統一為:
{
"AllianceID": "1",
"SID": "1",
"ProtocolType": 1,
"Signature": "9CDA085BE3957CB5D5CE866BFA25A07D",
"TimeStamp": "1371177060",
"Channel": "Vacations",
"Interface": "AddressSelectorInfoSearch",
"IsError": false,
"RequestBody": "輸入參數內容",
"ResponseBody": "",
"ErrorMessage": ""
}
HTTP返回格式統一為:
{
"AllianceID": 4802,
"SID": 105454,
"ProtocolType": 1,
"Signature": "2AEC78CB92AE382E016D307B8BCD8787",
"TimeStamp": "1383400366",
"Channel": "Vacations",
"Interface": "DistrictSearch",
"IsError": false,
"RequestBody": "",
"Header": {
"Culture": "",
"ShouldRecordPerformanceTime": false,
"Timestamp": "2013-11-02 21:52:39:90826",
"ReferenceID": "6515e738-1109-44cf-b00e-15e9f87a877d",
"ResultCode": 0,
"ResultNo": null,
"ResultMsg": "",
"RecentlyTime": "2013-11-02 21:52:38",
"AccessCount": 3000,
"CurrentCount": 1,
"ResetTime": "2013-11-02 21:53:38"
},
"ResponseBody": "返回內容",
"ErrorMessage": ""
}
備注:
順便給大家推薦一個json格式化校驗的網址:http://www.bejson.com/go.php?u=http://www.bejson.com/index.php
接口的輸入輸出參數都是以json格式進行傳遞,我使用的json和Entity序列化的工具是:ServiceStack.Text
---------------------------------------------------------------------------------------------------------------------------------------
1、Signature算法
/// <summary> /// 簽名算法 /// </summary> /// <param name="SecretKey">密鑰:站點的APIKey,可以在“站點列表”中查到;</param> /// <param name="AllianceID">聯盟代碼,可以在“我的賬戶”中查到;</param> /// <param name="SID">聯盟的站點ID,可以在“站點列表”中查到;</param> /// <param name="RequestType">請求接口服務的名稱</param> /// <param name="RequestType">從1970年到現在的秒數</param> /// <returns></returns> public string GetSignature(string SecretKey, int AllianceID, int SID, string RequestType, string TimeStamp) { string md5 = FormsAuthentication.HashPasswordForStoringInConfigFile(SecretKey, "MD5").ToUpper(); return FormsAuthentication.HashPasswordForStoringInConfigFile(TimeStamp + AllianceID + md5 + SID + RequestType, "MD5"); }
2、HttpPOST取得數據
/// <summary> /// HttpPost取得數據 /// </summary> /// <param name="url">網址</param> /// <param name="data">參數</param> /// <returns></returns> private string GetHttpPostX(string url, Dictionary<string, string> data) { try { WebClient WC = new WebClient(); WC.Encoding = System.Text.Encoding.UTF8; System.Collections.Specialized.NameValueCollection Col = new System.Collections.Specialized.NameValueCollection(); foreach (KeyValuePair<string, string> item in data) { Col.Add(item.Key, item.Value); } byte[] responseArray = WC.UploadValues(url, "POST", Col); string response = Encoding.UTF8.GetString(responseArray); return response; } catch (Exception Ex) { return Ex.Message; } }
3、接口請求返回參數實體
public class APICallEntity { public int AllianceID { set; get; } public int SID { set; get; } public int ProtocolType { set; get; } public string Signature { set; get; } public string TimeStamp { set; get; } public string Channel { set; get; } public string Interface { set; get; } public bool IsError { set; get; } public string RequestBody { set; get; } public HeaderEntity Header { set; get; } public string ResponseBody { set; get; } public string ErrorMessage { set; get; } } public class HeaderEntity { public string Culture { set; get; } public string ShouldRecordPerformanceTime { set; get; } public DateTime Timestamp { set; get; } public string ReferenceID { set; get; } }
3、實現接口:DistrictSearch 景區ID查詢
請求參數說明:
QueryCount int 查詢數量
StartID int 起始ID
返回參數說明:
DistrictIDs List<int> 景區信息列表
請求參數和返回參數實體
public class DistrictSearchCallEntity { public int QueryCount { set; get; } public int StartID { set; get; } } public class DistrictSearchCallReturnEntity { public List<int> DistrictIDs { set; get; } }
具體實現方法
string url = "http://openapi.ctrip.com/vacations/OpenServer.ashx"; string RequestType = "DistrictSearch"; string SecretKey = "74692D43-FA20-4FFB-B537-9A99D16AC71D"; int AllianceID = 4802; int SID = 105454; //計算從1970年到現在的秒數; TimeSpan span = (TimeSpan)(DateTime.UtcNow - new DateTime(0x7b2, 1, 1, 0, 0, 0, 0)); string TimeStamp = Convert.ToInt64(span.TotalSeconds).ToString(); //請求參數 DistrictSearchCallEntity callentity = new DistrictSearchCallEntity() { QueryCount = 10, StartID = 1 }; APICallEntity requestBody = new APICallEntity(); requestBody.AllianceID = AllianceID;//聯盟ID requestBody.ProtocolType = 1;//請求類型0-xml 1-Json requestBody.Channel = "Vacations";//頻道(Vacations-度假) requestBody.Interface = RequestType;//接口名稱 requestBody.SID = SID;//站點ID requestBody.TimeStamp = TimeStamp;//1970年到現在的秒數 requestBody.Signature = GetSignature(SecretKey, AllianceID, SID, RequestType, TimeStamp);//簽名 requestBody.RequestBody = callentity.ToJson();//請求查詢參數,根據ProtocolType使用不同格式(ServiceStack.Text) Dictionary<string, string> data = new Dictionary<string, string>(); data.Add("RequestJson", requestBody.ToJson());//格式化請求參數內容(ServiceStack.Text) string result = GetHttpPostX(url, data); //格式化返回內容(ServiceStack.Text) var rerurnEntiey = result.FromJson<APICallEntity>(); //判斷實現接口是否成功 if (!rerurnEntiey.IsError) { //格式化返回內容(ServiceStack.Text) var callreturnEntity = rerurnEntiey.ResponseBody.FromJson<DistrictSearchCallReturnEntity>(); }
本節全部源碼:
using System; using System.Collections.Generic; using System.Web.Security; using System.Net; using System.Text; using ServiceStack.Text; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string url = "http://openapi.ctrip.com/vacations/OpenServer.ashx"; string RequestType = "DistrictSearch"; string SecretKey = "74692D43-FA20-4FFB-B537-9A99D16AC71D"; int AllianceID = 4802; int SID = 105454; //計算從1970年到現在的秒數; TimeSpan span = (TimeSpan)(DateTime.UtcNow - new DateTime(0x7b2, 1, 1, 0, 0, 0, 0)); string TimeStamp = Convert.ToInt64(span.TotalSeconds).ToString(); //請求參數 DistrictSearchCallEntity callentity = new DistrictSearchCallEntity() { QueryCount = 10, StartID = 1 }; APICallEntity requestBody = new APICallEntity(); requestBody.AllianceID = AllianceID;//聯盟ID requestBody.ProtocolType = 1;//請求類型0-xml 1-Json requestBody.Channel = "Vacations";//頻道(Vacations-度假) requestBody.Interface = RequestType;//接口名稱 requestBody.SID = SID;//站點ID requestBody.TimeStamp = TimeStamp;//1970年到現在的秒數 requestBody.Signature = GetSignature(SecretKey, AllianceID, SID, RequestType, TimeStamp);//簽名 requestBody.RequestBody = callentity.ToJson();//請求查詢參數,根據ProtocolType使用不同格式(ServiceStack.Text) Dictionary<string, string> data = new Dictionary<string, string>(); data.Add("RequestJson", requestBody.ToJson());//格式化請求參數內容(ServiceStack.Text) string result = GetHttpPostX(url, data); //格式化返回內容(ServiceStack.Text) var rerurnEntiey = result.FromJson<APICallEntity>(); //判斷實現接口是否成功 if (!rerurnEntiey.IsError) { //格式化返回內容(ServiceStack.Text) var callreturnEntity = rerurnEntiey.ResponseBody.FromJson<DistrictSearchCallReturnEntity>(); } } /// <summary> /// 簽名算法 /// </summary> /// <param name="SecretKey">密鑰:站點的APIKey,可以在“站點列表”中查到;</param> /// <param name="AllianceID">聯盟代碼,可以在“我的賬戶”中查到;</param> /// <param name="SID">聯盟的站點ID,可以在“站點列表”中查到;</param> /// <param name="RequestType">請求接口服務的名稱</param> /// <param name="RequestType">從1970年到現在的秒數</param> /// <returns></returns> public string GetSignature(string SecretKey, int AllianceID, int SID, string RequestType, string TimeStamp) { string md5 = FormsAuthentication.HashPasswordForStoringInConfigFile(SecretKey, "MD5").ToUpper(); return FormsAuthentication.HashPasswordForStoringInConfigFile(TimeStamp + AllianceID + md5 + SID + RequestType, "MD5"); } /// <summary> /// HttpPost取得數據 /// </summary> /// <param name="url">網址</param> /// <param name="data">參數</param> /// <returns></returns> private string GetHttpPostX(string url, Dictionary<string, string> data) { try { WebClient WC = new WebClient(); WC.Encoding = System.Text.Encoding.UTF8; System.Collections.Specialized.NameValueCollection Col = new System.Collections.Specialized.NameValueCollection(); foreach (KeyValuePair<string, string> item in data) { Col.Add(item.Key, item.Value); } byte[] responseArray = WC.UploadValues(url, "POST", Col); string response = Encoding.UTF8.GetString(responseArray); return response; } catch (Exception Ex) { return Ex.Message; } } public class APICallEntity { public int AllianceID { set; get; } public int SID { set; get; } public int ProtocolType { set; get; } public string Signature { set; get; } public string TimeStamp { set; get; } public string Channel { set; get; } public string Interface { set; get; } public bool IsError { set; get; } public string RequestBody { set; get; } public HeaderEntity Header { set; get; } public string ResponseBody { set; get; } public string ErrorMessage { set; get; } } public class HeaderEntity { public string Culture { set; get; } public string ShouldRecordPerformanceTime { set; get; } public DateTime Timestamp { set; get; } public string ReferenceID { set; get; } } public class DistrictSearchCallEntity { public int QueryCount { set; get; } public int StartID { set; get; } } public class DistrictSearchCallReturnEntity { public List<int> DistrictIDs { set; get; } } }
ServiceStack.Text下載地址 https://github.com/ServiceStack/ServiceStack.Text
本文只是一步一步的講了怎么樣實現攜程接口,下一節我們介紹下接口功能的封裝。
三五旅游網:http://www.35lvyou.com