概述
重新回顾了之前做的淘宝API模块,记录一下思路。
(1) 在开始开发之前,先要注册成为一个开发者,创建自己的应用。
步骤在淘宝开发平台中http://open.taobao.com/doc/detail.htm?id=66中已有详细说明,在这里不再重复介绍。
注意,在创建应用中,需要填写一个回调URL。在填写回调地址时,如果还在测试阶段的,可以填写一个本地的地址,例如 http://localhost/webERP/api/taobao/taobaoAuth.php,在本地测试通过后,要将其应用上线时,才将回调地址更改正式域名地址。
(2)用户授权登录。
在我们的应用与淘宝平台对接后,需要获取用户的隐私信息,为了保证数据的安全性和隐私性,我们的应用需要引导用户完成“使用淘宝账号登录并授权”的流程(http://open.taobao.com/doc/detail.htm?spm=0.0.0.0.ckBODm&id=118)。以此来获取访问令牌access_token,access_token是应用在调用API访问和修改用户数据时必须传入的参数。
在引导使用应用的用户登录授权时,页面会跳转到所填写的回调地址,同时返回授权码code,我们可以利用这个返回的授权CODE和注册应用时分配的AppSecret,通过Http Post方式换取访问令牌access_Token,获取访问令牌的返回值以json格式返回。
返回结果示例如下:
{
各个字段代表的含义如下:
Key | 类型 | 选项 | 示例 | 说明 |
access_token | string | 必选 | 2YotnFZFEjr1zCsicMWpAA | Access token |
token_type | string | 必选 | Bearer | Access token的类型目前只支持bearer |
expires_in | number | 必选 | 10(表示10秒后过期) | Access token过期时间 |
refresh_token | string | 可选 | 2YotnFZFEjr1zCsicMWpAA | Refresh token |
re_expires_in | number | 可选 | 10(表示10秒后过期) | Refresh token过期时间 |
r1_expires_in | number | 必选 | 10(表示10秒后过期) | r1级别API或字段的访问过期时间 |
r2_expires_in | number | 必选 | 10(表示10秒后过期) | r2级别API或字段的访问过期时间 |
w1_expires_in | number | 必选 | 10(表示10秒后过期) | w1级别API或字段的访问过期时间 |
w2_expires_in | number | 必选 | 10(表示10秒后过期) | w2级别API或字段的访问过期时间 |
taobao_user_nick | string | 必选 | 淘宝测试test | 淘宝账号 |
taobao_user_id | string | 必选 | 706388888 | 淘宝帐号对应id |
sub_taobao_user_id | string | 可选 | 2343535 | 淘宝子账号对应id |
sub_taobao_user_nick | string | 可选 | 淘宝测试test:123 | 淘宝子账号 |
具体获取授权码code和访问令牌token的代码如下:
webERP / api / taobao / common / taobaoClientHelper.php
<?php
/**
* 这个文件包含 taobaoClientHelper 类
*/
/**
* taobaoClientHelper 引导使用应用的用户登录到指定的地址获取code
* 根据code 和 AppSecret获取访问令牌access_token
*
*/
require_once 'taobaoClient.php';
class taobaoClientHelper extends taobaoClient{
/**
* @var string 新建应用时填写的回调地址
*/
public $redirctUri;
/**
* @var string 获取授权码CODE的地址
*/
protected $authorizeUrl = 'https://oauth.taobao.com/authorize';
/**
* @var string 获取访问令牌token的地址
*/
protected $tokenUrl = 'https://oauth.taobao.com/token';
/**
* 设置沙箱环境,如果是在本地测试,可以调用该方法,返回的数据是虚拟的
*/
public function sandboxEnv(){
$this->authorizeUrl = 'https://oauth.tbsandbox.com/authorize';
$this->tokenUrl = 'https://oauth.tbsandbox.com/token';
//访问API的地址
$this->gateWayUrl = 'http://gw.api.tbsandbox.com/router/rest';
}
/**
* 返回引导用户授权的http请求URL
* @param string $redirctUri 新建淘宝应用时填写的回调地址
*/
public function getAuthorizeUrl( $redirctUri = null ){
$redirctUri || $redirctUri = $this->redirctUri;
//根据淘宝要求的参数
//参数response_type 固定值为code
$param['response_type'] = 'code';
//参数client_id 创建应用时的Appkey
$param['client_id'] = $this->appKey;
//参数redirect_uri 应用的回调地址,必须与创建应用时所填回调页面url一致
$param['redirect_uri'] = $redirctUri;
//可选参数state ,自定义,颁发授权后会原封不动返回
$param['state'] = 'Nancy';
//可选参数view,默认值为web
$param['view'] = 'web';
return $this->authorizeUrl . '?' . http_build_query($param);
}
/**
* 根据返回的授权码code,通过http post方式换取access token,以json的格式返回
* @param string $code 授权登录后返回的code码
* @param string $state 授权登录时原封不动返回的state
* @param string $redirctUri 回调地址
* @return 访问令牌access token 的json对象
*/
public function fetchAuthorizeToken($code, $state, $redirctUri = null){
$redirctUri || $redirctUri = $this->redirctUri;
//系统参数
$param = array(
'client_id' => $this->appKey; //创建应用时的Appkey
'client_secret' => $this->secretKey; //创建应用时的Appkey
'grant_type' => 'authorization_code'; //授权类型,默认为authorization_code
'code' => $code; //授权码code
'redirect_uri' => $redirctUri; //授权码code
'state' => $state; //可选参数state
'view' => 'web'; //可选参数,默认为web
);
//父类函数curl() 利用curl post 参数到tokenUrl,进行连接
$json = $this->curl($this->tokenUrl, $param);
//避免包含生涩的汉字而进行utf8的转码
$json = iconv('gbk', 'utf-8', $json);
//解析json格式
$json = json_decode($json);
//如果返回异常,会返回异常error 和 error_description
if( isset($json->error) && isset($json->error_description) ){
throw new Exception($json->error_description, intval($json->error));
}
return $json;
}
}
?>
我们编写一个小小的程序来测试如何获取token,在此之前,需要一些必要的配置信息 webERP / api / taobao / common / taobaoConfig.php
<?php
header('Content-Type:text/html;charset=UTF-8');
ini_set('display_errors' , 'on'); //显示所有错误
ini_set('display_startup_errors', 'on');
error_reporting( E_ALL ^ E_NOTICE); //显示除去notic的所有错误信息
include 'taobaoClientHelper.php';
$taobao = new taobaoClientHelper();
$taobao->appKey = "创建应用时的Appkey";
$taobao->secretKey = "创建应用时的secretKey";
//如果已经获取过访问令牌,并且令牌还在有效期内,可以不再需要授权
$access_token = "访问令牌access_token";
/**
* 回调地址,在创建应用时,如果还处于测试阶段,回调地址可以写测试地址
* 设置测试环境
*/
if( $_SERVER['SERVER_NAME'] == 'localhost'){
$taobao->redirectUri = 'http://localhost/webERP/api/taobao/taobaoAuth.php';
$taobao->sandboxEnv();
}else{
$taobao->redirectUri = 'http://正式域名/webERP/api/taobao/taobaoAuth.php';
}
?>
测试淘宝授权,该文件为回调地址文件 webERP/api/taobao/taobaoAuth.php
<?php
/**
* 回调文件 taobaoAuth.php
*/
include 'common/taobaoConfig.php';
//用户登录授权时,会返回授权码CODE
if(isset($_GET['code'])){
$state = isset($_GET['state'])? $_GET['state'] : '';
//获取access token
try{
$token = $taobao->fetchAcessToken( $_GET['code'] , $state );
if( isset($token->access_token) ){
//返回的access_token可以保存在数据库中,或者做自己需要的操作
echo '<pre>';
print_r($token);
}
}catch (Exception $e){
//异常,重新获取
header('Location: taobaoAuth.php');
}
}else{
//引导用户到授权登录页面
$authUrl = $taobao->getAuthorizeUrl();
echo "<script>window.open('".$authUrl."');</script>";
}
?>
获得access_token后,我们就可以正式调用API了,在下一篇我们就会开始讨论淘宝API的调用。
最后
以上就是快乐小蘑菇为你收集整理的回顾篇:淘宝API web开发一 授权登录的全部内容,希望文章能够帮你解决回顾篇:淘宝API web开发一 授权登录所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复