1,接口使用HTTP协议POST
方式调用接口,文档中使用C#
语言说明.
2,接口地址:http //www.weixun.cn/Api/V1
3,加密传输涉及到:MD5
,Base64
4,离线API开发文档 下载
// 字符串转换为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加密传入的字符串 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); }
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系统错误
200:请求成功
402:分销账号资金不足
403:预定手机系黑名单
404:分销账号资金不足
405:预定时间受限
406:预定数量超出限制
407:预定数量太少
408:重复预定多次
410:产品库存不足
500:系统异常