1,接口说明

1,接口使用HTTP协议POST方式调用接口,文档中使用C#语言说明.

2,接口地址:http //www.weixun.cn/Api/V1

3,加密传输涉及到:MD5,Base64

4,离线API开发文档   下载

Base64,C#代码
        // 字符串转换为Base64字符串
        public static string ToBase64(string str)
        {
            byte[] s = Encoding.UTF8.GetBytes(str);
            return Convert.ToBase64String(s);
        }
        // Base64字符串转换为标准字符串
        public static string FromBase64Str(string input)
        {
            if (string.IsNullOrEmpty(input)) return input;
            //HTTP传输过程中加号->空格
            input = input.Replace(" ", "+");
            var byt = Convert.FromBase64String(input);
            return Encoding.UTF8.GetString(byt);
        }
MD5,C#代码
        //MD5加密传入的字符串
        private static string GetMD5(string input, string charset = "utf-8")
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] data = md5.ComputeHash(Encoding.GetEncoding(charset).GetBytes(input));
            StringBuilder builder = new StringBuilder(32);
            for (int i = 0; i < data.Length; i++)
            {
                builder.Append(data[i].ToString("x2"));
            }
            return builder.ToString();
        }

4,传输对象:


        public class ApiRequest {
        // 请求时间(与Signature换算Ticks时间相同)
        public DateTime Date { get; set; }
        // 分销商Id(编号请联系景链客服获取)
        public string UserId { get; set; }
        // 签名:(日期Ticks+distId) + UserId;
        public string Signature { get; set; }
        // 请求类型
        public string RequestType { get; set; }
        // 正文部分
        public string RequestBody { get; set; }
    }

对应的序列化部分(以预付订单付款接口为例):

{"Date":"2014-07-21 18:36:29","UserId":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX","Signature":"6a9ed86f31026a9ed86f3102","RequestType":"OrderToPay","RequestBody":"{\"OrderId\":\"77bdeaa3-54c9-4822-8231-6a9ed86f3102\",\"Len\":1}"}

RequestType包含哪几类:CancelOrder(撤销订单),CreateOrder(创建订单),GetSceneries(获取景点),GetTickets(获取门票),OrderToPay(预付款订单付款),其他接口以文档为准...

5,如何生成签名:

        public static string GenerateSignature(DateTime date, int distId, string userId)
        {
            DateTime unixDate = new DateTime(1970, 1, 1);
            //获取Ticks.
            var sp = (date - unixDate).Ticks;
            //str = ticks + 分销商编码的 数学和 再和字符串 分销商用户Id 组合
            var str = (sp + distId) + userId;
            //按规则生成字符串后MD5加密该字符串并返回
            return GetMD5(str);
        }

2,接口调用

获取景区信息,附完整的调用代码

            var currentDateTime = DateTime.Parse("2014-10-10 13:12:10"), //当前时间,不能和服务器时间差大于30分钟
            var distId = XXXX;//分销商编码,这里替换为自己的编码
            var userId = "**************************************";//分销商用户Id,一般为Guid

             var signature = GenerateSignature(currentDateTime,distId,userId); //计算并生成签名


            //把传递的ApiRequest对象json序列化字符串
            var json = JsonConvert.SerializeObject(new ApiRequest
            {
                Date = currentDateTime, //当前时间,不能和服务器时间差大于30分钟
                DistId = distId,
                UserId = userId,
                RequestBody = "{\"Page\":1}",//RequestBody根据RequestType的接口类型传递具体的Body部分.
                RequestType = "GetSceneries",//获取景区信息
                Signature = signature //根据规则生成的签名,注意计算用的时间戳等于currentDateTime
            });
            //json字符串再转换为Base64字符串
            var jToBase = ToBase64(json);

            //请求路径:
            var basePath = "http://www.weixun.cn/api/v1";
            //Post的字符串参数为requestjson,内容为jToBase
            var postStr = string.Format("requestjson={0}",jToBase);

            var request = HttpWebRequest.CreateHttp(basePath);
            request.UserAgent = "WeiXunCMS/1.0(Contact:vipwan#sina.com)";
            request.Method = "POST";//POST方式提交数据
            var writeStream = request.GetRequestStream();
            var bytes = Encoding.UTF8.GetBytes(postStr);
            request.ContentType = "application/x-www-form-urlencoded";
            writeStream.Write(bytes, 0, bytes.Length);
            writeStream.Close();
            using (var response = request.GetResponse())
            {
                using (var result = response.GetResponseStream())
                {
                    using (var sr = new StreamReader(result))
                    {
                        var json = sr.ReadToEnd();
                        var rtn = JObject.Parse(json);
                        if (rtn.Property("Status").value.ToString() == "200")
                        {
                            //成功后返回景区json列表集合.需要反Base64
                            var apiResult = FromBase64Str(rtn.Property("Result").value.ToString());
                            //根据自己具体情况解析返回的内容即可.
                        }
                        else{
                            //失败后读取Error
                            error = rtn.Property("Error").value.ToString();
                        }
                    }
                }
            }

获取景区信息返回结果200(成功),400(账号信息有误),401(签名不正确),500系统错误

获取门票信息

RequestType="GetTickets"

RequestBody部分 {"SceneryId":1},1表示景区编号

获取门票信息返回结果200(成功),400(账号信息有误),401(签名不正确),500系统错误

撤销订单

RequestType="CancelOrder"

RequestBody部分 {"Id":"77bdeaa3-54c9-4822-8231-6a9ed86f3102"},Id表示订单编号;目前不支持部分撤单.需要撤单重下

撤销订单返回结果200(成功),400(账号信息有误),401(签名不正确),500系统错误

创建订单

RequestType="CreateOrder"

RequestBody部分,UserName:用户名,Mobile:预定手机,Len:预定数,Remark:备注信息,PlayDate:游玩日期:yyyy-MM-dd格式,IdCard:身份证:部分门票不需要,TicketId:门票编号

{"UserName":"张三","Mobile":"13987654321","Len":1,"Remark":"备注信息","PlayDate":"2014-07-30","IdCard":"510921111111111111","TicketId":1001}

创建订单返回结果200(成功),400(账号信息有误),401(签名不正确),500系统错误

预付订单付款

RequestType="OrderToPay"

RequestBody部分,OrderId:表示订单编号,Len:表示需付款数量

{"OrderId":"77bdeaa3-54c9-4822-8231-6a9ed86f3102","Len":1}

预付订单付款返回结果200(成功),400(账号信息有误),401(签名不正确),500系统错误

3,其他错误码说明

200:请求成功

402:分销账号资金不足

403:预定手机系黑名单

404:分销账号资金不足

405:预定时间受限

406:预定数量超出限制

407:预定数量太少

408:重复预定多次

410:产品库存不足

500:系统异常