以为公司祖传代码太多使用的PHP5.4.45版本,所以无法使用SDK包,只能原生自己写,踩了不少坑。

1.授权

https://oauth.taobao.com/authorize?response_type=code&client_id=123456&redirect_uri=http://127.0.0.11/taobao.php&state=12312&view=web

我这里使用的本地地址测试的,正式环境,所以回调修改为自己的,还有client_id改为自己的App Key就好,应该没有什么问题

2.获取access_token

//获取access_token
function access_token_get(){
    $data['code'] = '*******************************';
    $data['client_id'] = '********';
    $data['client_secret'] = '*******************************';
    $data['redirect_uri'] = 'http://127.0.0.11/taobao.php';
    $data['grant_type'] = 'authorization_code';
    $data['state'] = '12312';
    $data['view'] = 'web';
    $url ='https://oauth.taobao.com/token';
    $result_token = curl($url,$data);
    $tokenPath = "taobao/".$data['client_id'].".json";//文件名字
    $fp = fopen($tokenPath, "w");
    fwrite($fp, json_encode($result_token));
    fclose($fp);
}

这里参数继续换成自己的,code使用授权后地址栏返回的,这里要注意一个坑,使用自己写的curl有时候会出问题,暂时不清楚哪里问题所以使用了SDK自带的curl

function curl($url, $postFields = null)
{
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_FAILONERROR, false);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 // if ($this->readTimeout) {
 //  curl_setopt($ch, CURLOPT_TIMEOUT, $this->readTimeout);
 // }
 // if ($this->connectTimeout) {
 //  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->connectTimeout);
 // }
 //https 请求
 if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) {
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
 }

 if (is_array($postFields) && 0 < count($postFields))
 {
  $postBodyString = "";
  $postMultipart = false;
  foreach ($postFields as $k => $v)
  {
   if("@" != substr($v, 0, 1))//判断是不是文件上传
   {
    $postBodyString .= "$k=" . urlencode($v) . "&";
   }
   else//文件上传用multipart/form-data,否则用www-form-urlencoded
   {
    $postMultipart = true;
   }
  }
  unset($k, $v);
  curl_setopt($ch, CURLOPT_POST, true);
  if ($postMultipart)
  {
   curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
  }
  else
  {
   curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1));
  }
 }
 $reponse = curl_exec($ch);

 if (curl_errno($ch))
 {
  throw new Exception(curl_error($ch),0);
 }
 else
 {
  $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  // if (200 !== $httpStatusCode)
  // {
  //  throw new Exception($reponse,$httpStatusCode);
  // }
 }
 curl_close($ch);
 return $reponse;
}

3.到这里就获取完毕了,下面刷新按照文档所说是通过授权获取的refresh_token(前置条件:re_expires_in>0),可用来刷新access token 的r2时长。

这里我使用的App Key不知为何返回的re_expires_in一直为0暂时无法解决,已提交工单,后续有结果会更新上来

 
    header("Content-Type:text/html;charset=UTF-8");
    date_default_timezone_set("Asia/Shanghai");

    require_once 'taobao/qm.php';

    $appKey = '你的APP key';

    $appSecret = '***************************';


    $paramArr = array(

        'app_key' => $appKey,

        'format' => 'json',

        'method' => 'taobao.top.auth.token.refresh',

        //'grant_type' => 'refresh_token',

        'refresh_token' => '****************************************',

        'client_id' => $appKey,

        'client_secret' => $appSecret,

        'simplify' => true,

        'sign_method'=>'md5',

        'timestamp' => date('Y-m-d H:i:s'),

        'v' => '2.0'



    );

    //生成签名

    $sign = createSign($paramArr, $appSecret);

    //组织参数

    $strParam = createStrParam($paramArr);

    $strParam .= 'sign='.$sign;


    $url =  'https://eco.taobao.com/router/rest?'.$strParam;
   

    $result_token = curl($url,$postfields);

签名函数createSign代码

//签名函数

function createSign ($paramArr,$appSecret) {

     $sign = $appSecret;

     ksort($paramArr);

     foreach ($paramArr as $key => $val) {

         if ($key != '' && $val != '') {

             $sign .= $key.$val;

         }

     }

     $sign.=$appSecret;

     $sign = strtoupper(md5($sign));

     return $sign;

}

这里刷新和请求接口是使用的一种方法,这里有个坑,在沙箱环境不会出现,但是正式环境会出现,我踩了一下午才踩平,组装的$paramArr里面的数组必须安装ASCII码表排序。不然会报错,签名错误。

补充,关于使用的App Key不知为何返回的re_expires_in一直为0的问题经过相关技术人员回复处理发现是淘宝方问题,有部分App Key是re_expires_in返回就为0的,但是access token的过期时间为一年,暂时够用,但是这个真的坑,总不能一年去授权一次吧,那天系统突然崩溃也不知道啥情况,希望官方能解决下。

这里补充一个遇到的问题,就是查询买家信息之类的都是带***的经过加敏处理模糊化的信息,这里只有用聚石塔服务器请求接口产能返回完整信息。

暂时就这些内容,如有问题欢迎留言

 

posted on 2019-04-16 11:23  代码书写人生  阅读(792)  评论(0编辑  收藏  举报