淘宝API开发系列--商家的绑定

在上篇《淘宝API开发系列--开篇概述》介绍了下淘宝API平台的一些基本知识,由于一直有事情忙,就没有及时跟进随笔的更新,本篇继续讨论淘宝API的开发知识,主要介绍商家的绑定操作。上篇我们说过,淘宝就是基于应用程序键来控制用户的访问频率和流量的,另外可以通过应用程序键,让使用者登陆确认,获取到相关的授权码,然后获取SessionKey,作为访问使用者淘宝资源(如买入卖出等私人记录的信息)。 

我们再看看SessionKey是如何获取的(下面是淘宝关于正式环境下SessionKey的说明):

正式环境下获取SessionKey

注意:web插件平台应用和web其它应用在正式环境下是同样的获取方法

1、WEB应用

例如回调URL为:http://localhost

访问 http://container.open.taobao.com/container?appkey={appkey},页面会跳转到回调URL,地址类似如下:

http://localhost/?top_appkey={appkey} &top_parameters=xxx&top_session=xxx&top_sign=xxx

回调url上的top_session参数即为SessionKey
2、客户端应用

访问 http://auth.open.taobao.com/?appkey={appkey},即可获得授权码

通过http方式访问 http://container.open.taobao.com/container?authcode={授权码},会得到类似如下的字符串

top_appkey=1142&top_parameters=xxx&top_session=xxx&top_sign=xxx

字符串里面的top_session值即为SessionKey。 

由于本篇文章主要是介绍C/S客户的应用,因此客户端的应用就不能通过回调Url方式获得用户的验证,我们可以通过在Winform中的WebBrowser控件,显示一个登陆验证及访问确认的操作界面给客户,当客户确认的时候并返回Session Key的内容界面的时候,我们取出Session Key保存并关闭浏览器窗口即可,今后把该SessionKey作为参数来访问相关需要Session Key的API即可。

另外,由于SessionKey的间隔时间比较短,如果API调用间隔时间比较长,那么SessionKey有可能失效的,但是我们注意到,如果API调用的时候,SesionKey过期 那么会抛出TopException(其中ErrorCode为26或者27是SessionKey过期),里面有关于与TopException的部分说明如下:

26 Missing Session 缺少SessionKey参数
27 Invalid Session 无效的SessionKey参数

 我们先看看具体实现的界面,然后分析其中的实现逻辑吧。

1、首次需要登录的时候,使用一个Winform嵌套一个WebBrowser控件,实现网页登录。 

 

 2、商家用户输入账号密码后,确认是否授权程序访问相关资源。

 

 3、确认后生成SessionKey,这个Key正是我们的程序需要的关键内容,因此需要自动获取出来。

 

4、程序拿到该Session Key后,把它作为参数来访问淘宝API获取相关的信息,这里获取交易API的购买信息,需要SessionKey的。

 

 以上就是使用SessionKey的API工作流程界面,我们下面介绍一下相关的实现代码。

1) 主窗体主要的操作代码:

    public partial class Form1 : Form
    {
        private TopJsonRestClient jsonClient;
        private TopContext context;

        private void Form1_Load(object sender, EventArgs e)
        {
            this.winGridView1.ProgressBar = this.toolStripProgressBar1.ProgressBar;
            this.winGridView1.AppendedMenu = this.contextMenuStrip1;

            jsonClient = new TopJsonRestClient("http://gw.api.taobao.com/router/rest", "12033411", "你的密钥");
            
            client = GetProductTopClient("json");
            xmlClient = new TopXmlRestClient("http://gw.api.taobao.com/router/rest", "12033411", "你的密钥"");
        }

        /// <summary>
        /// 判断是否顺利获取SessionKey
        /// </summary>
        /// <returns></returns>
        private bool GetAuthorizeCode()
        {
            string authorizeCode = "";
            FrmAuthorized dlg = new FrmAuthorized();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                authorizeCode = dlg.AuthrizeCode;
            }
            if (string.IsNullOrEmpty(authorizeCode)) return false;
                        
            context = SysUtils.GetTopContext(authorizeCode);
            if (context == null) return false;

            return true;
        }

        private void BindData()
        {
            if (context == null)
            {
                bool flag = GetAuthorizeCode();
                if (!flag) return;
            }

            string sessionKey = context.SessionKey;

            ////获取用户信息
            //UserGetRequest request = new UserGetRequest();
            //request.Fields = "user_id,nick,sex,created,location,alipay_account,birthday";
            //request.Nick = "wuhuacong";
            //User user = client.Execute(request, new UserJsonParser());
            //MessageBox.Show(ReflectionUtil.GetProperties(user));

            try
            {
                //买入交易
                TradesBoughtGetRequest req = new TradesBoughtGetRequest();
                req.Fields = "tid,title,price,type,iid,seller_nick,buyer_nick,status,orders";
                req.PageNo = 1;
                req.PageSize = 10;
                ResponseList<Trade> rsp = jsonClient.GetBoughtTrades(req, sessionKey);
                this.winGridView1.DataSource = rsp.Content;
                MessageBox.Show(rsp.Content.Count.ToString());

                //卖出交易
                TradesSoldGetRequest soldReq = new TradesSoldGetRequest();
                soldReq.Fields = "tid,title,price,type,iid,seller_nick,buyer_nick,status,orders";
                soldReq.PageNo = 1;
                soldReq.PageSize = 10;
                ResponseList<Trade> soldRsp = jsonClient.GetSoldTrades(soldReq, sessionKey);
                this.winGridView1.DataSource = soldRsp.Content;
                MessageBox.Show(soldRsp.Content.Count.ToString());
            }
            catch (TopException ex)
            {
                if (ex.ErrorCode == 26 || ex.ErrorCode == 27)
                {
                    if (MessageUtil.ShowYesNoAndError("SessionKey过期,您是否需要重新认证") == DialogResult.Yes)
                    {
                        bool flag = GetAuthorizeCode();
                        if (!flag) return;

                        BindData();//重新刷新
                    }
                    else
                    {
                        return;
                    }
                }
            }
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            BindData();
        }

 2、用户登陆的窗体,就是一个form窗体加上一个WebBrowser控件,窗体代码如下:

    public partial class FrmAuthorized : Form
    {
        /// <summary>
        /// 授权码
        /// </summary>
        public string AuthrizeCode = "";
        private string url = "http://open.taobao.com/authorize/?appkey=12033411";

        public FrmAuthorized()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 获取HTML页面内制定Key的Value内容
        /// </summary>
        /// <param name="html"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetHiddenKeyValue(string html, string key)
        {
            string str = html.Substring(html.IndexOf(key));
            str = str.Substring(str.IndexOf("value") + 7);
            int eindex1 = str.IndexOf("'");
            int eindex2 = str.IndexOf("\"");
            int eindex = eindex2;
            if (eindex1 >= 0 && eindex1 < eindex2)
            {
                eindex = eindex1;
            }
            return str.Substring(0, eindex);
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url.AbsoluteUri == url)
            {
                AuthrizeCode = GetHiddenKeyValue(this.webBrowser1.DocumentText, "autoInput");
                if (!string.IsNullOrEmpty(AuthrizeCode) && AuthrizeCode.IndexOf("TOP-") >= 0)
                {
                    this.DialogResult = DialogResult.OK;
                    this.Close();
                }
            }
        }

        private void FrmAuthorized_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate(url);
        }
    }

这样我们就可以在首次使用API或者SessionKey失效的时候,让商家用户输入账号密码并确认即可,其他使用即可顺利无阻。

是不是有点意思呢,赶快试试吧,说不定带来一些意想不到的收获及创意哦。 

本文转自博客园伍华聪的博客,原文链接:淘宝API开发系列--商家的绑定,如需转载请自行联系原博主。

时间: 2024-09-07 01:27:49

淘宝API开发系列--商家的绑定的相关文章

淘宝API开发系列---阿里.聚石塔.开放平台的使用

好久没有继续跟进淘宝的API使用了,有很多做相关应用的同行都来咨询,很多都因为自己开发工作比较忙而没有来得及好的处理,前几天,有一个朋友叫帮忙指导如何使用淘宝API,由于原来有一些成熟的例子应用,因此原以为直接运行或者稍微修改一下即可,因此没有太多的注意. 可是,发现淘宝的API应用变化已经很大了,离我最后一篇淘宝API例子的随笔<淘宝API开发系列---淘宝API的测试及使用2 >有一年多的时间了,因此重新到http://api.taobao.com/myresources/standard

淘宝API开发系列---淘宝API的测试及使用2

继续前面一篇随笔<淘宝API开发系列---淘宝API的测试及使用>,来继续介绍淘宝API的具体代码开发部分,上篇主要是介绍淘宝SDK开发的一些流程及必备的信息,以及掌握如何学会利用API文档.淘宝API测试工具来获取我们所需的数据,其中我一般倾向于获取Json数据,然后进行分析,其中Json数据可以通过JsonView工具(http://jsonviewer.codeplex.com/)进行格式化显示,方便我们了解和区分各个属性的信息.另外淘宝的SDK里面,封装了很多对象,我们通过数据就可以获

淘宝API开发系列--开篇概述

前阵子有空发现淘宝的API挺有意思的,就留意学习了一下,淘宝从2008.6月开始公测以来,API渐趋稳定,文档的相关说明也比较细致,不过基于淘宝API做应用的软件目前应该还不是很多,不过由于马云的影响力,淘宝API终会发光发热,给我们做开发的程序员多一份选择,多一个摆弄的东西. 在学习中,发现有一些比较好玩,比较有趣的地方,如果有空继续的话,准备开一个系列,总结介绍一下相关的知识,希望能够给博客多一份人气,多一份积累. 淘宝开放平台(Taobao Open Plateform,又叫TOP),地址

谈谈Magento与淘宝API整合

在群里聊到了这个话题,把聊的内容整理下放这里. 现在用Magento来建国内B2C网站的越来越多了,而淘宝是国内电子商务界的老大,这也就带来一种现象就是,使用Magento做独立B2C运营的公司,必然也会在淘宝上开个店.这就带来了一个很现实的问题,如何统一去管理淘宝店和独立官网的数据,比如订单,比如产品数据.库存等. 这里分享我所知道的三种方案 第一种,开发独立的第三方订单处理系统,通过淘宝api抓淘宝订单,通过Magento的api抓Magento的订单,放在一起处理. 第二种,淘宝店已经在用

为天猫及淘宝平台上的商家提供数据云服务

和讯科技消息 7月10日,今日天猫携手阿里云.万网联合推出聚石塔平台(cloud.tmall.com),意在以云计算为基础,为天猫及淘宝平台上的商家提供数据云服务. 天猫总裁张勇(逍遥子)表示,聚石塔平台的根本目标为安全.效率.协作.稳定,即通过开放的电商云平台整合整个生态系统的全链路数据给商家共享,帮助商家提高运营管理效率,提高数据使用效率,更加安全地获得所需信息,最终提高商家的电商能力,也使电商实现由"繁"到"易"的转变. 随后天猫副总裁王文斌(菲青)表示,聚石

图片-淘宝API问题 请教大神们帮忙 我完全小白哦

问题描述 淘宝API问题 请教大神们帮忙 我完全小白哦 http://interface.im.taobao.com/api/wwfile/downloadWwFile.json?spm=0.0.0.0.5PDty5&width=532&height=432&size=51108&md5hash=2a357bb8be942cc14d76f5391d0dbca9&ftsid=239702641460869263&suffix=.jpg&fromid=c

一位淘宝前端开发人员的心声:马云的加班论是谬论

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 这是某位淘宝前端开发人员一篇博客,转载过来,与各位分享: 最近心里有点烦,烦出高血压的话,就要到"无忧高血压http://www.wuyougaoxieya.cn"去找些降压的方法了.忙着一堆事情,终于能轻松点了,码码字,透透气. 不加班冲突 昨天因为不愿意加班,和一个项目经理Y发生了一些不愉快.Y的一部分理论是马云语录:

调用淘宝api问题,获取数据response那一行报错

问题描述 调用淘宝api问题,获取数据response那一行报错 TaobaoClient client = new DefaultTaobaoClient(su.getUrl(), su.getAppKey(), su.getAppSercet()); WangwangEserviceGroupmemberGetRequest req = new WangwangEserviceGroupmemberGetRequest (); if(managerId!=null && !"

调用淘宝api接口taobao.logistics.offline.send (自己联系物流(线下物流)发货)

问题描述 调用淘宝api接口taobao.logistics.offline.send(自己联系物流(线下物流)发货)在这个接口的调用中后台收到淘宝返回异常信息为:[调用API更新淘宝交易状态为已发货失败,信息:ErrCode:15ErrMsgRemoteserviceerrorSubErrCode:CD01SubErrMsg:CD01#当前订单不允许用其他物流公司发货]这里提示信息为,我们使用的物流公司错误,我们代码中使用的物流公司为:varreq=newLogisticsOfflineSen