無力吐槽淘寶開發平台相關文檔的表述清晰度、錯誤率、各種費解的概念、讓人頭暈目眩的導航等等。至少能夠在幾年前就開放眾多的API供第三方調用,算得上是有前瞻性的一次重要舉措。閑來無事,咱也費心研究了下,有錯莫怪我,要怪就怪淘寶文檔太不給力。
大致是這么個流程:創建應用——開發應用——提交審核——上線使用。
在創建應用前,還得支付寶實名認證。像咱這種基本不網購的人,支付寶的賬號密碼綁定手機號是啥早忘了。於是用我表妹賬號,特別開心的是,表妹已經開了家網點,沒幾個月,據說小丫頭片子已經能月入2K了(利潤)。哎,我又想轉行了。。。我用我表妹賬號,能訂閱已經上線的賣家服務,發現很多都是免費而且做的不錯的,也有淘寶自己開發的應用,比如量子恆道。
我特地研究了下這個應用,發現單憑現在開放出來的TOPAPI,基本上不能獲取該應用所需的數據,比如實時客戶訪問。結論:第三方只能在較小范圍內做做簡單業務處理和數據分析,能賺到錢,但想要賺大錢,精致程度如淘寶本土應用,我認為幾乎是不可能的事,除非淘寶真的打算將這塊蛋糕完全奉獻出來。
廢話少說,開始創建應用,換句話說就是填寫基本信息。
應用分web應用和客戶端應用。貌似客戶端應用發布后,是通過web下載安裝的,而且資質要求很高,我等屌絲只能不關心略過。web應用有個回調URL,其實就是你的web服務站點地址,在沙箱環境管理下,我們可以將回調URL設為localhost以便本機開發測試。
授權協議:若要獲取私密數據,需要得到用戶授權。默認是OAuth2.0協議。要求先獲取授權碼,然后通過授權碼獲取訪問憑證和刷新憑證,應用可以通過訪問憑證獲取用戶私密數據,當訪問憑證過期時,可以嘗試使用刷新憑證重新獲取訪問憑證,當然刷新憑證也有有效期,過期只能讓用戶重新授權。
原本使用HttpWebRequest獲取憑證,可參看dudu的ASP.NET MVC通過OAuth調用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);忽略證書驗證,否則得不到期望的結果,可能會拋異常。await client.PostAsync(uri, httpContent);這句折磨我很久,具體細節可以看我的上一篇博文:async、await在ASP.NET[ MVC]中之線程死鎖的故事。
下面開始調用API。我們可以直接通過訪問WebApi獲取Json格式的數據,不過還要轉換成實體類神馬的太過麻煩,幸好淘寶為幾種流行的語言提供了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對應的Request類 5 req.Fields = "sid,cid,nick,title"; 6 req.Nick = nick; 7 ShopGetResponse rsp = client.Execute(req);//執行API請求並將該類轉換為response對象 8 return rsp.Shop; 9 }
DefaultTopClient構造函數的三個參數分別為沙箱API地址(上線使用時請改為正式地址),APPKEY,APPSecret,這兩個東西是在創建應用時給到我們的,也有沙箱和正式環境兩個版本。Request.Fields表示請求的字段(不同字段訪問級別可能不一樣,這方面我沒去研究),其余屬性一般為請求參數,不同API的參數要求請參看對應的文檔說明。當Response返回時,會將數據轉化成實體類,方便.NET程序訪問。
我們也可以將TopApi封裝為自己的WebApi供JS請求(猜測未驗證:由於眾所周知的跨域問題,JS應該不能直接請求TopApi,或者說相當麻煩。不過善良的淘寶也同樣提供了JSSDK工具包,具體如何應用請有興趣的同學研究好告訴我:))。
獲取商品列表:
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就可以如是調用:
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將變為<XXX>k__BackingField,對這種名稱的屬性JS只能通過中括號的形式訪問,點形式讀取屬性將讀不到,造成有些組件(比如KendoUI的Grid)數據無法綁定。更詳細信息可參看C#對 Json的序列化和反序列化會出現“k_BackingField”。
運行程序:
首先會跳到授權界面(如果你的應用不涉及到私密數據的訪問,那么可以不考慮這個步驟)。
在大部分瀏覽器中,由於沙箱地址的證書無效,會導致這一界面顯示異常。在Chorme中,可以事先使用用戶賬號登錄mini.taobao(沙箱使用,模擬真實環境),在IE10中干脆就無解。淘寶文檔中對這一情況作了一定說明。
授權成功后,轉到應用界面:
轉載請注明本文出處:http://www.cnblogs.com/newton/archive/2013/05/14/3078788.html