这段时间做了Cdiscount平台的对接,当前只是做到了抓取账号订单。在此做一个总结,备忘。同时也算是一把辛酸史,供后来人嘲笑。
1.API说明地址:https://dev.cdiscount.com/marketplace
2.API对接步骤:
后台添加API账号、密码 --> 获取Token --> 调用对应接口-->处理接口返回数据。
关于对接时的详细步骤和涉及到的接口等详细信息,API说明中已经包含,不做累述。这里主要说一下这次对接时我踩过的一些坑。
1.Cdiscount账号申请后后台会同时自动创建一个对应的api账号。比如后台登陆账号是:liu1314,那对应会有一个liu1314-api的api账号,当我们要对接API时,只需要先在后台设置该api账号的密码,然后就可以通过api账号和密码去获取token。获取到token后才能使用token调用接口方法。
这里要吐槽的是,密码一定要绝对严格按照平台的密码规则要求去设置。注意,我说的是绝对严格按照!一开始我一直获取不到token,改了好几次密码都不行,来来回回开了不少的case。 最终获取成功的时候,只是把密码里的特殊字符改成了规则里提到的@符号...... (不知道是必须这么要求的还是那边在后台做了什么处理,总之来来回回半个月总算才获取到了token.)
token的有效期是48小时。
2.本以为获取到token以后,接下来就一路通畅了,事实证明我还是太年轻了。
再次提醒,调用接口方法时,入参请严格参考API说明中的实例。如果想多尝试,也请先严格使用API说明中的参数,然后再做减法。
抓取订单调的GetOrderList方法。通常抓取订单时,会分别用创建时间区间和修改时间区间各抓取一次。
我开始入参只使用了时间参数,但是每次返回的都是所有的订单,而不是传入的时间区间内的数据。尝试了多次依旧不行!挠头,继续开case..... 等来平台的回复是,他们那边调用没有问题,然后附上request和response的文件了事.....
摸不着头脑。某一瞬间,回想到获取token时的遭遇,于是传入参数完全按照case里的request,结果果然获取到了期望的时间段内的订单数据。-_- 所以原因是什么呢?API不会告诉你,case回复也不会告诉你!经过不断的尝试,最终我得出的结论是,传入参数必须包含具体的订单状态,时间参数才会起作用!!我???
然而,坑到这里还没完。当我用创建时间区间抓取订单的时候,发现漏单了。作为抓单的程序,漏单这种事情是绝不能存在的!可核实后发现,漏掉的单创建时间都是在该时间区间里面,那为什么会抓不到呢?这完全不科学啊!凡事总有原因,尤其“搬砖”这件事情。于是继续各种姿势不停尝试......
最后终于终于找到了正确的路,原来传创建时间区间的时候,必须得同时传入修改时间区间的参数!!我?????
同理可得,按订单修改时间区间抓取订单的时候,创建时间区间也必须要赋值,只是,传个无关紧要的创建时间区间即可。
目前为止,自己也已经对接过好几个国外的电商平台,但Cdiscount这次依旧实实在在的给我上了一课!
祝各位后来者同行好运........
附获取token的代码(C#):
private string UpdateToken()
{
string url = ConfigurationManager.AppSettings["GetTokenUrl"];
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.ContentType = "application/json";
request.Method = "GET";
string base64Credentials = GetEncodedCredentials();
request.Headers.Add("Authorization", "Basic " + base64Credentials);
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
string result = string.Empty;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
result = reader.ReadToEnd();
}
if (!string.IsNullOrEmpty(result))
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(result);
result = xmlDoc.InnerText;
}
else
{
Console.WriteLine("Token获取异常。未获取到返回值。");
throw new Exception("Token获取异常。未获取到返回值。");
}
}
private string GetEncodedCredentials()
{
string m_Username = ConfigurationManager.AppSettings["cUserName"];
string m_Password = ConfigurationManager.AppSettings["cPassword"];
string mergedCredentials = string.Format("{0}:{1}", m_Username, m_Password);
byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials);
return Convert.ToBase64String(byteCredentials);
}