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:系统异常