自动获取淘宝API数据访问的SessionKey
最近在忙与淘宝做对接的工作,总体感觉淘宝的api文档做的还不错,不仅有沙箱测试环境,而且对于每一个api都可以通过api测试工具生成想要的代码,你完全可以先在测试工具中测试之后再进行代码的编写,这样就减少了我们不停修改代码的次数;但是有一点淘宝的文档上没有说明,sessionkey(有的地方也称是accessToken)的有效期比较短,如果没有你的应用没有发布的话,那么你的sessionkey的有效期只有1天,如果sessionkey过期了,私有的数据你就不能进行访问了。这个问题折腾了我一天半,当遇到这个问题之后,我立即发扬问度娘传统,但是非常的失望,基本上都是用JAVA的,.net也只有winform形式的,对于webform中没有提及。期间仿照JAVA的代码进行编码,但是失败了,可能是因为对.net没有达到滚瓜烂熟的地步,有些java的方法和对象我在.net都没有找到与之对应的方法和对象,就这样一直试,最终还是以失败告终。最后还是在淘宝的文档中找到了方法,不过这个方法的有效时间是多久还需要在之后进行验证。真是后悔自己没有好好的看看文档,导致浪费了大量的时间。下面就说说我是如何实现自动获取淘宝API的SessionKey。
首先还是建议大家想看一下淘宝提供的文档http://open.taobao.com/doc/detail.htm?spm=0.0.0.0.nDCovh&id=118,这篇文档比较详细的介绍了在各个平台上如何延长SessionKey的有效期,我使用的是Refreshing an Access Token(通过刷新令牌刷新访问令牌)方式来延长访问令牌的时间。一般来说有三步,获取授权码code,得到访问令牌和刷新令牌,通过刷新令牌刷新访问令牌的有效期。下面对这三个部分进行说明,不过只针对采用Oauth2.0进行身份验证和授权协议的应用。
下面这幅图是淘宝文档上的,它说明了淘宝OAuth2.0的授权过程:

- 获取授权码Code
其实获取授权码Code非常的简单,只要你按照https://oauth.taobao.com/authorize?response_type=code&client_id=12304977&redirect_uri=http://www.oauth.net/2/&state=1212&view=web这种Url的格式,将连接中的client_id和redirect_uri替换成自己的就行,然后在浏览器输入该地址,回调的地址中就有code。这条Url中,client_id是我们从淘宝中获取到的AppKey,回调地址改成自己的本地地址就行。
- 获取访问令牌和刷新令牌
获取访问令牌这一操作建议每一次要获取数据时就进行一次操作,这样可以保证访问令牌SessionKey和Refresh_key保持最新。刚开始的时候,这一步我就执行了一次,获取刷新令牌后,以为刷新令牌的有效期会很长,可是第二天我运行第三步的代码是,发现出现了400错误,没办法,我又重新来了一遍同样的操作。现在我也没有弄明白是什么原因导致刷新令牌不能使用,如果有人知道,还请留下你的足迹,我猜可能是刷新令牌过期了。获取刷新令牌和访问令牌的代码如下:
Top.Api.Util.WebUtils wu = new Top.Api.Util.WebUtils();
IDictionary<string, string> param = new Dictionary<string, string>();
param.Add("grant_type", "authorization_code");
param.Add("code",code);
param.Add("client_id", appkey);
param.Add("client_secret", appsecret);
param.Add("redirect_uri", "http://192.168.3.120");
param.Add("view", "web");
string response = wu.DoPost(tokenUrl, param);
这里的DoPost方法返回的是Json格式的数据,需要使用JavaScriptSerializer进行解析。这样就获取到了access_token和refresh_token。下面就进入下一步,进行访问令牌的有效期进行刷新。
- 刷新访问令牌的有效期
一般来说,如果你的应用没有发布,那么你的sessionKey的有效期是1天,我的应用没有发布,刷新之后,访问令牌的有效期变成了两天,不知道发布之后的应用有效期能够刷到多久,知道的还麻烦留下足迹。刷新令牌有效期的代码如下:
Top.Api.Util.WebUtils wu = new Top.Api.Util.WebUtils();
IDictionary<string, string> param = new Dictionary<string, string>();
param.Add("grant_type", "refresh_token");
param.Add("refresh_token", refreshToken);
param.Add("client_id", appKey);
param.Add("client_secret", appSecret);
param.Add("view", "web");
string response = wu.DoPost(refreshTokenUrl, param);
和上面一样,返回的数据格式为json格式。
还要说的是,刷新令牌需要在刷新有效期内进行刷新,不然运行代码时可能会报错。建议是将使用授权码Code获取刷新令牌和访问令牌这段代码放入一个Job中,根据刷新令牌的有效期来设置job运行的间隔时间。
其实如果参照TopApi的文档,很容易就能掌握上面的知识,只是很多时候我们都在追求速度,对于文档都不细看,当遇到问题时,还是需要倒过来阅读文档,这与之前的意图背道而驰,希望自己能够吸取这次的教训。
自动获取淘宝API数据访问的SessionKey的更多相关文章
- 关于淘宝的数据来源,针对做淘宝客网站的淘宝api调用方法
上次写了个淘宝返利模式的博客,直接被移除首页,不知道何故啊.可能是真的跟技术不太刮边. 众所周知,能够支撑一个网站运营的最基础不是程序写的多么好.也不是有多么牛X的运营人员,最主要的是数据,如果没有数 ...
- C# 脚本代码自动登录淘宝获取用户信息
C# 脚本代码自动登录淘宝获取用户信息 最近遇到的一个需求是如何让程序自动登录淘宝, 获取用户名称等信息. 其实这个利用SS (SpiderStudio的简称) 实现起来非常简单. 十数行代码就可 ...
- SB淘宝api的奇葩问题! 一则服务器无法访问淘宝api
<?xml version="1.0" encoding="utf-8" ?><error_response><code>3 ...
- 淘宝API开发系列---阿里.聚石塔.开放平台的使用
好久没有继续跟进淘宝的API使用了,有很多做相关应用的同行都来咨询,很多都因为自己开发工作比较忙而没有来得及好的处理,前几天,有一个朋友叫帮忙指导如何使用淘宝API,由于原来有一些成熟的例子应用,因此 ...
- taobao_api项目开坑,自主完成淘宝主要接口的开发-版本:卖家版(非淘宝api)
项目名称:taobao_api 项目目的:独立实现各个淘宝操作的相关api,不依赖淘宝提供的api,而是自己实现接口 前期实现接口:已付款订单查询(自动更新), 订单发货 , 订单备注 应用场景:中小 ...
- 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX 阅读目录 DataX是什么? DataX用来解决什么? DataX特点? DataX结构模式(框架+插件) DataX在淘宝的运用 DataX是什么? Data ...
- 大数据 --> 淘宝异构数据源数据交换工具 DataX
淘宝异构数据源数据交换工具 DataX DataX是什么? DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesys ...
- 淘宝API得到单个商品的信息,用了淘宝的SDK...
淘宝api获取到的数据.返回结果可以选择json格式和xml格式的啊.每个api下面都有sdk调用示例哦. 详细:http://wenwen.soso.com/z/q335640192.htm 淘宝开 ...
- 淘宝API学习之道:淘宝TOP之API接口接入教程
作为一个中小型站点开发人员,淘宝API的开放大大缩短了站点的开发周期和运作效率.面对海量的数据.开发人员仅仅要细致阅读开发文档,熟悉对应的接口,就能够把数据导入自己的站点,这样就不必望洋兴叹了. 眼下 ...
随机推荐
- Swift下CoreData的使用
我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite.解归档.沙盒存放等等.这些方式中,能够大规模存储,并保持性能的只有使用sqlite了.而这里将记录下Cocoa自身继承的数据库的存储 ...
- this解析
定时器中的this function Aaa() { var _this = this; //解决关键 this.a = 12; //但凡被定时器调的函数,this必然是window,所以,show里 ...
- lzugis——Arcgis Server for JavaScript API在自己的定义InfoWindow
你看到这个标题嫌烦.因为我最近一直与研究问题,相关文章使这些也可以只,同时要读我文章的朋友.我的文章能够给你带来帮助. 在相关的内部的前两篇文章,达到InfoWindow经div实现的东西,成Info ...
- Java--Vector类
Java Vector 类 Vector类实现了一个动态数组.和ArrayList和相似,但是两者是不同的: Vector是同步访问的. Vector包含了许多传统的方法,这些方法不属于集合框架. V ...
- 注释为基础的SpringMVC
SpringMVC根据征求意见 正在使用SpringMVC以前的评论.首先,为使说明.于springMVC3.x版本号之后提供了很easy的启用注解方法仅仅须要的-servlet.xml中加上< ...
- java中的switch结构
switchkeyword的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的推断,在结构上比if语句要清晰非常多.switch语句的语法格式为:switch(表达式) ...
- matlab 二元函数的画法
plot:画线(curve,二维空间以及三维空间) surf:画面(surface,一般在三维空间) 1. surf 绘图函数 surf 是 surface 的缩写,表示表面(显然至少三维图像才会有表 ...
- (转)react 使用 ref 报错 ,[eslint] Using string literals in ref attributes is deprecated. (react/no-string-refs)
原文地址:https://www.cnblogs.com/gangerdai/p/7396226.html react 项目中给指定元素加事件,使用到 react 的 ref 属性,Eslink 报错 ...
- UVA 10869 - Brownie Points II(树阵)
UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线.然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分 ...
- 使用FileStream向txt格式的文本文件 "追加" 新内容并读取
原文:使用FileStream向txt格式的文本文件 "追加" 新内容并读取 //得到文件路径. static string filePath = AppDomain.Curren ...