淘宝开放平台API
前两天按照淘宝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;
}
?>
还没有评论,来说两句吧...