前两天按照淘宝API提供的demo代码改写成了类
由于公司的店铺比较多,而且淘宝做了授权改造,所有API都需要使用session
所以把一些关键参数存储在了数据库之中便于调用
字段 | 类型 | 属性 | Null | 缺省值 | 额外 | 执行操作 | ||||
---|---|---|---|---|---|---|---|---|---|---|
ID | int(10) | 是 | NULL | auto_increment | 改变 | 丢弃 | 键名 | 索引 | 唯一 | |
shop_nick | varchar(32) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 | ||
userid | int(5) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 | ||
appkey | int(10) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 | ||
appsecret | varchar(50) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 | ||
Session | varchar(64) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 | ||
LastUp | int(10) | 是 | NULL | 改变 | 丢弃 | 键名 | 索引 | 唯一 |
调用代码:
<?php $tb = new TBao(1); $method='taobao.items.onsale.get'; $paramArr = array( /* API应用级输入参数 Start*/ 'fields' => 'num_iid,title,price,volume,list_time,num ,modified ,outer_id', 'page_no' => '1', 'page_size' => '40' /* API应用级输入参数 End*/ ); $result_item = $tb->get_info($method,$paramArr); ?>
接口类代码:
<?php class TBao { //一些基础配置项 var $url = "http://gw.api.taobao.com/router/rest?"; var $format = "xml"; var $v = "2.0"; var $sign_method = "md5"; //关键参数 private $AppKey; private $AppSecret; private $top_Session; var $UserID; var $ShopNick; var $method; function __construct($TB_id=0){ $this->TBao($TB_id); } /** * 根据店铺ID 构造该店铺的一些关键参数 */ function TBao($TB_id=0){ global $DB; $ss_sql = "select * from TB_session where ID='$TB_id' "; $DB->query($ss_sql); $DB->next_record(); $this->AppKey= $DB->f("appkey"); $this->AppSecret= $DB->f("appsecret"); $this->top_Session= $DB->f("Session"); $this->UserID= $DB->f("userid"); $this->ShopNick= $DB->f("shop_nick"); } /** * 获取淘宝信息 */ function get_info($method,$paramArr=array()){ $this->method = $method; //组合参数 加入一些简单的数据验证 $unix_time = time(); if(date("T") == "UTC"){ $unix_time += 28800; } $tid = isset($paramArr['tid'])?$paramArr['tid']:0; $paramArr['timestamp'] = date("Y-m-d H:i:s",$unix_time); $paramArr['format'] = $this->format; $paramArr['v'] = $this->v; $paramArr['sign_method'] = $this->sign_method; $paramArr['method'] = $method; $paramArr['app_key'] = $this->AppKey; if(!empty($this->top_Session)){ $paramArr['session'] = $this->top_Session; } //生成签名 $sign = $this->createSign($paramArr); //组织参数 $strParam = $this->createStrParam($paramArr); $strParam .= 'sign='.$sign; //构造Url $urls = $this->url.$strParam; //连接超时自动重试 $cnt=0; while($cnt < 3 && ($tb_result=@$this->vita_get_url_content($urls))===FALSE) $cnt++; //解析数据 if($this->format == "xml"){ $result = $this->getXmlData($tb_result); }else{ $result = json_decode($tb_result,true); } $result = $this->analyse_result($result,$tid); return $result; } /** * 处理返回结果 如果有错误 怎么记录 及 处理 */ function analyse_result($data,$tid=0){ //var_dump($data); if(isset($data['error_response'])){ $error = $data['error_response']; }elseif(isset($data['code'])){ $error = $data; }else{ return $data; } //怎么处理这个错误结果 输出 记录 与反馈 $error_msg = $error['msg']; $error_msg .= isset($error['sub_msg'])?$error['sub_msg']:""; $error_code = $error['code']; $error_code .= isset($error['sub_code'])?$error['sub_code']:""; $error = "错误码:".$error_code.";错误信息:".$error_msg; $this->tb_log(2,$tid,$error,0); $this->_halt($error."<br>"); } //处理接口调用日志 function tb_log(){ } //获取session授权信息 function get_sessionkey(){ } //获取数据兼容file_get_contents与curl function vita_get_url_content($url) { if(function_exists('file_get_contents')) { $file_contents = file_get_contents($url); } else { $ch = curl_init(); $timeout = 5; curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $file_contents = curl_exec($ch); curl_close($ch); } return $file_contents; } //签名函数 function createSign ($paramArr) { $sign = $this->AppSecret; ksort($paramArr); foreach ($paramArr as $key => $val) { if ($key !='' && $val !='') { $sign .= $key.$val; } } $sign = strtoupper(md5($sign.$this->AppSecret)); return $sign; } //组参函数 function createStrParam ($paramArr) { $strParam = ''; foreach ($paramArr as $key => $val) { if ($key != '' && $val !='') { $strParam .= $key.'='.urlencode($val).'&'; } } return $strParam; } //解析xml函数 function getXmlData ($strXml) { $pos = strpos($strXml, 'xml'); if ($pos) { $xmlCode=simplexml_load_string($strXml,'SimpleXMLElement'); $arrayCode=$this->get_object_vars_final($xmlCode); return $arrayCode ; } else { return ''; } } function get_object_vars_final($obj){ if(is_object($obj)){ $obj=get_object_vars($obj); } if(is_array($obj)){ foreach ($obj as $key=>$value){ $obj[$key]=$this->get_object_vars_final($value); } } return $obj; } //停止程序输出错误信息 function _halt($msg=''){ exit($msg); } } ?>
淘宝session获取的程序
<?PHP header("Content-type: text/html; charset=utf-8"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); header("Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . "GMT" ); header("Cache-Control: no-cache, must-revalidate" ); header("Pragma: no-cache" ); $top_appkey = $_GET['top_appkey']; $top_parameters = $_GET['top_parameters']; $top_session = $_GET['top_session']; $top_sign = $_GET['top_sign']; if(empty($top_appkey)){ $uid = $_GET['uid']; $uid_to_appkey = array('1'=>'123456');//123456为淘宝分配的AppKey die(header("Location:http://container.api.taobao.com/container?appkey=".$uid_to_appkey[$uid]."&encode=utf-8")); } $appkey_to_appsecret = array( '123456'=>'xxxxx');//xxxxx为淘宝分配的AppSecret $app_secret = $appkey_to_appsecret[$top_appkey]; $unix_time = time(); if(date("T") == "UTC"){ $unix_time += 28800; } //验证sign 是否一致 规则:base64(md5(top_appkey+top_parameters+top_session+app_secret)) $check_sign = base64_encode(md5($top_appkey.$top_parameters.$top_session.$app_secret,true)); if($top_sign != $check_sign){ exit("非法访问"); } //解析top_parameters 获取上下文参数 $parameters = hashmap(base64_decode($top_parameters)); echo "<pre>"; print_r($parameters); //验证时间是否在5分钟之内(前后一共10分钟) $check_time = round($parameters['ts']/1000); if($check_time < $unix_time-300 || $check_time > $unix_time+300){ //exit("时间不合法"); } //将top_session存储至文件中便于使用 改为存入数据库!!!! $sql = "update TB_session set Session ='$top_session' , LastUp = unix_timestamp() where appkey='$top_appkey'"; //echo $sql; $DB->query($sql); echo "失效时长:".$parameters['expires_in']."<br>"; echo $top_session."完毕"; //转化parameter的方法 function hashmap($data){ $result = array(); $t1 = explode("&",$data); if(!empty($t1) && isset($t1[0])){ foreach($t1 as $item){ $t2 = explode("=",$item); if(!empty($t2) && isset($t2[0])){ $result[$t2[0]] = isset($t2[1])?$t2[1]:""; } } } return $result; } ?>