zoukankan      html  css  js  c++  java
  • 淘宝API对接实例

    以为公司祖传代码太多使用的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的过期时间为一年,暂时够用,但是这个真的坑,总不能一年去授权一次吧,那天系统突然崩溃也不知道啥情况,希望官方能解决下。

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

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

  • 相关阅读:
    extern--C#调用C++等其他非托管代码
    unhandledException详细介绍
    MySql如何安装?
    Mindoc搭建流程
    反射_IsDefined判断方法上有自定义的标签
    WebApi_返回Post格式数据
    编码
    IP地址与MAC地址
    Tcp/Ip:Telnet指令
    create-react-app使用的问题
  • 原文地址:https://www.cnblogs.com/zdzdbk/p/10715843.html
Copyright © 2011-2022 走看看