淘寶API應(yīng)用開發(fā)小試
無力吐槽淘寶開發(fā)平臺相關(guān)文檔的表述清晰度、錯誤率、各種費解的概念、讓人頭暈?zāi)垦5膶?dǎo)航等等。至少能夠在幾年前就開放眾多的API供第三方調(diào)用,算得上是有前瞻性的一次重要舉措。閑來無事,咱也費心研究了下,有錯莫怪我,要怪就怪淘寶文檔太不給力。
大致是這么個流程:創(chuàng)建應(yīng)用——開發(fā)應(yīng)用——提交審核——上線使用。
在創(chuàng)建應(yīng)用前,還得支付寶實名認證。像咱這種基本不網(wǎng)購的人,支付寶的賬號密碼綁定手機號是啥早忘了。于是用我表妹賬號,特別開心的是,表妹已經(jīng)開了家網(wǎng)點,沒幾個月,據(jù)說小丫頭片子已經(jīng)能月入2K了(利潤)。哎,我又想轉(zhuǎn)行了。。。我用我表妹賬號,能訂閱已經(jīng)上線的賣家服務(wù),發(fā)現(xiàn)很多都是免費而且做的不錯的,也有淘寶自己開發(fā)的應(yīng)用,比如量子恒道。

我特地研究了下這個應(yīng)用,發(fā)現(xiàn)單憑現(xiàn)在開放出來的TOPAPI,基本上不能獲取該應(yīng)用所需的數(shù)據(jù),比如實時客戶訪問。結(jié)論:第三方只能在較小范圍內(nèi)做做簡單業(yè)務(wù)處理和數(shù)據(jù)分析,能賺到錢,但想要賺大錢,精致程度如淘寶本土應(yīng)用,我認為幾乎是不可能的事,除非淘寶真的打算將這塊蛋糕完全奉獻出來。
廢話少說,開始創(chuàng)建應(yīng)用,換句話說就是填寫基本信息。

應(yīng)用分web應(yīng)用和客戶端應(yīng)用。貌似客戶端應(yīng)用發(fā)布后,是通過web下載安裝的,而且資質(zhì)要求很高,我等屌絲只能不關(guān)心略過。web應(yīng)用有個回調(diào)URL,其實就是你的web服務(wù)站點地址,在沙箱環(huán)境管理下,我們可以將回調(diào)URL設(shè)為localhost以便本機開發(fā)測試。
授權(quán)協(xié)議:若要獲取私密數(shù)據(jù),需要得到用戶授權(quán)。默認是OAuth2.0協(xié)議。要求先獲取授權(quán)碼,然后通過授權(quán)碼獲取訪問憑證和刷新憑證,應(yīng)用可以通過訪問憑證獲取用戶私密數(shù)據(jù),當訪問憑證過期時,可以嘗試使用刷新憑證重新獲取訪問憑證,當然刷新憑證也有有效期,過期只能讓用戶重新授權(quán)。
原本使用HttpWebRequest獲取憑證,可參看dudu的ASP.NET MVC通過OAuth調(diào)用Google API獲取用戶信息。后來想說學學新概念,改為用httpclient獲取,當然過程很坑爹。
1 async Task<string> GetToken(string code) 2 { 3 WebRequestHandler webRequestHandler = new WebRequestHandler(); 4 webRequestHandler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteCertificateValidate); 5 HttpClient client = new HttpClient(webRequestHandler); 6 var httpContent = new FormUrlEncodedContent(new Dictionary<string, string>() 7 { 8 {"grant_type", "authorization_code"}, 9 {"code", code}, 10 {"client_id", "1021489060"}, 11 {"client_secret", "sandboxccbc898dce7e6525cca1b1f1c"}, 12 {"redirect_uri", "http://localhost:9198"} 13 }); 14 string uri = "https://oauth.tbsandbox.com/token"; 15 var response = await client.PostAsync(uri, httpContent); 16 return response.Content.ReadAsStringAsync().Result; 17 }
由于淘寶沙箱的證書無效,webRequestHandler.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(RemoteCertificateValidate);忽略證書驗證,否則得不到期望的結(jié)果,可能會拋異常。await client.PostAsync(uri, httpContent);這句折磨我很久,具體細節(jié)可以看我的上一篇博文:async、await在ASP.NET[ MVC]中之線程死鎖的故事。
下面開始調(diào)用API。我們可以直接通過訪問WebApi獲取Json格式的數(shù)據(jù),不過還要轉(zhuǎn)換成實體類神馬的太過麻煩,幸好淘寶為幾種流行的語言提供了SDK工具包,我屁顛屁顛地下了.net版本,開用。
獲取店鋪信息:
1 private Shop GetShopInfo(string nick) 2 { 3 ITopClient client = new DefaultTopClient("http://gw.api.tbsandbox.com/router/rest", "1021489060", "sandboxccbc898dce7e6525cca1b1f1c");//實例化ITopClient類 4 ShopGetRequest req = new ShopGetRequest(); //實例化具體API對應(yīng)的Request類 5 req.Fields = "sid,cid,nick,title"; 6 req.Nick = nick; 7 ShopGetResponse rsp = client.Execute(req);//執(zhí)行API請求并將該類轉(zhuǎn)換為response對象 8 return rsp.Shop; 9 }
DefaultTopClient構(gòu)造函數(shù)的三個參數(shù)分別為沙箱API地址(上線使用時請改為正式地址),APPKEY,APPSecret,這兩個東西是在創(chuàng)建應(yīng)用時給到我們的,也有沙箱和正式環(huán)境兩個版本。Request.Fields表示請求的字段(不同字段訪問級別可能不一樣,這方面我沒去研究),其余屬性一般為請求參數(shù),不同API的參數(shù)要求請參看對應(yīng)的文檔說明。當Response返回時,會將數(shù)據(jù)轉(zhuǎn)化成實體類,方便.NET程序訪問。
我們也可以將TopApi封裝為自己的WebApi供JS請求(猜測未驗證:由于眾所周知的跨域問題,JS應(yīng)該不能直接請求TopApi,或者說相當麻煩。不過善良的淘寶也同樣提供了JSSDK工具包,具體如何應(yīng)用請有興趣的同學研究好告訴我:))。
獲取商品列表:
1 public class ItemController : ApiController 2 { 3 public IEnumerable<Item> GetItemsInventory(string sessionKey) 4 { 5 ITopClient client = new DefaultTopClient("http://gw.api.tbsandbox.com/router/rest", "1021489060", "sandboxccbc898dce7e6525cca1b1f1c"); 6 ItemsInventoryGetRequest req = new ItemsInventoryGetRequest(); 7 req.Fields = "approve_status,num_iid,title,nick,type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,seller_cids,outer_id"; 8 ItemsInventoryGetResponse rsp = client.Execute(req, sessionKey); 9 return rsp.Items; 10 } 11 }
前臺JS就可以如是調(diào)用:
1 $.ajax({ 2 url: '/apis/Item/GetItemsInventory?sessionKey=@ViewData["SessionKey"]', 3 type: "get", 4 dataType: "json", 5 success: function (data) { 6 ConstructData(data); 7 $("#grid").kendoGrid({ 8 dataSource: { 9 data: data, 10 pageSize: 15 11 }, 12 height:530, 13 scrollable: true, 14 sortable: true, 15 filterable: true, 16 pageable: { 17 input: true, 18 numeric: false 19 }, 20 columns: [ 21 { field: "Title", title: "商品名稱" }, 22 { field: "Price", title: "售價", format: "{0:c}", width: "130px" }, 23 { field: "Num", title: "庫存", width: "130px" }, 24 { field: "ListTime", title: "上架時間" }, 25 { field: "DelistTime", title: "下架時間" } 26 ] 27 }); 28 } 29 });
這里需要注意,返回的data并不能直接拿過來用。因為淘寶SDK中的.NET實體類加了Serializable特性且屬性為自動屬性,序列化為Json對象屬性名稱XXX將變?yōu)?lt;XXX>k__BackingField,對這種名稱的屬性JS只能通過中括號的形式訪問,點形式讀取屬性將讀不到,造成有些組件(比如KendoUI的Grid)數(shù)據(jù)無法綁定。更詳細信息可參看C#對 Json的序列化和反序列化會出現(xiàn)“k_BackingField”。
運行程序:
首先會跳到授權(quán)界面(如果你的應(yīng)用不涉及到私密數(shù)據(jù)的訪問,那么可以不考慮這個步驟)。

在大部分瀏覽器中,由于沙箱地址的證書無效,會導(dǎo)致這一界面顯示異常。在Chorme中,可以事先使用用戶賬號登錄mini.taobao(沙箱使用,模擬真實環(huán)境),在IE10中干脆就無解。淘寶文檔中對這一情況作了一定說明。
授權(quán)成功后,轉(zhuǎn)到應(yīng)用界面:

轉(zhuǎn)載請注明本文出處:http://www.rzrgm.cn/newton/archive/2013/05/14/3078788.html

浙公網(wǎng)安備 33010602011771號