攜程分銷聯盟-旅游度假接口實現1


攜程分銷聯盟提供酒店、機票、團購、度假幾大旅游產品分銷接口;本系列主要研究度假相關接口。

接口文檔下載地址: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(請求報文)

例:

http://openapi.ctrip.com/vacations/OpenServer.ashx?RequestJson=%7b%22AllianceID%22%3a%221%22%2c%22SID%22%3a%221%22%2c%22ProtocolType%22%3a1%2c%22Signature%22%3a%22817D9FF70999176DE1F887D5CC4B732B%22%2c%22TimeStamp%22%3a%221371177110%22%2c%22Channel%22%3a%22Vacations%22%2c%22Interface%22%3a%22AddressSelectorInfoSearch%22%2c%22IsError%22%3afalse%2c%22RequestBody%22%3a%22%7b%5c%22AddressSelectorIDs%5c%22%3a%5b1%2c2%5d%7d%22%2c%22ResponseBody%22%3a%22%22%2c%22ErrorMessage%22%3a%22%22%7d

請求報文格式

報文最外層使用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

本文只是一步一步的講了怎么樣實現攜程接口,下一節我們介紹下接口功能的封裝。

qrcode

 

三五旅游網:http://www.35lvyou.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM