eBay 允许用户创建自己的应用程序来接入eBay Web Service,让应用程序与eBay进行数据对接。
eBay Web Service支持两种协议:XML / HTTPS 和 SOAP。我们的应用使用的XML / HTTPS的协议,下面就来介绍这种接入方式。
在使用XML API时,我们的应用程序需要装配一个XML文档,每个请求都由指定的XML元素组成,以此来告知eBay应用程序希望进行的操作。
同时我们也要定义HTTP header,将XML文档和HTTP header一同使用HTTPS协议发送请求给eBay。
处理请求之后,eBay服务器通过HTTPS发送一个XML文件形式的响应给我们的应用程序。
我们再对返回的XML进行解析,提取所需的数据。
参考代码如下:webERP / api / ebay / common / eBaySession.php
<?php
/**
* 这个文件包含ebaySession 类
*/
/**
* ebaySession 创建一个string类型的数组,作为HTTP header
* 将XML文件请求和HTTP header发送给ebay,请求数据
*/
class eBaySession{
private $requestToken; //应用的访问令牌
private $devID; //开发者ID
private $appID; //应用ID
private $certID; //证书ID
private $serverUrl; //请求URL
private $compatLevel; //API 版本
private $siteID; //ebay站点ID 如(0 = US, 2 = Canada, 3 = UK, ...)
private $verb; //使用的接口名称
private $serviceName; //使用的service名称
private $operationName; //请求的操作名称
/**
* 构造函数,初始化
* @param string $userRequestToken 应用的访问令牌
* @param string $developerID 开发者ID
* @param string $applicationID 应用ID
* @param string $certificateID 应用ID
* @param string $serverUrl 请求的URL
* @param string $compatabilityLevel API版本
* @param string $siteToUseID ebay站点ID 如(0 = US, 2 = Canada, 3 = UK, ...)
* @param string $callName 使用的接口名称
* @param string $serviceName 使用的service名称
* @param string $operationName 请求的操作名称
*/
public function __construct($userRequestToken, $developerID, $applicationID, $certificateID, $serverUrl,
$compatabilityLevel, $siteToUseID, $callName,$serviceName,$operationName)
{
$this->requestToken = $userRequestToken;
$this->devID = $developerID;
$this->appID = $applicationID;
$this->certID = $certificateID;
$this->compatLevel = $compatabilityLevel;
$this->siteID = $siteToUseID;
$this->verb = $callName;
$this->serverUrl = $serverUrl;
$this->serviceName = $serviceName;
$this->operationName = $operationName;
}
/**
* 设置特定于eBay的Header,以向服务器提供调用的信息。使用Header的名称并后跟恰当的值来填充一个数组
* @return string Array HTTP Header
*/
private function buildEbayHeaders(){
$headers = array(
'X-EBAY-SOA-SERVICE-NAME: ' . $this->serviceName,
'X-EBAY-SOA-OPERATION-NAME: ' . $this->operationName,
'X-EBAY-SOA-SERVICE-VERSION: 1.1.0',
'X-EBAY-SOA-SECURITY-TOKEN: ' . $this->requestToken,
'X-EBAY-SOA-REQUEST-DATA-FORMAT: XML',
'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $this->compatLevel,
'X-EBAY-API-DEV-NAME: ' . $this->devID,
'X-EBAY-API-APP-NAME: ' . $this->appID,
'X-EBAY-API-CERT-NAME: ' . $this->certID,
'X-EBAY-API-CALL-NAME: ' . $this->verb,
'X-EBAY-API-SITEID: ' . $this->siteID
);
return $headers;
}
/**
* 发送HTTP请求
* @param string $rquestBody XML格式的字符串
* @return string ebay返回的XML格式的字符串响应
*/
public function sendHttpRequest($requestBody){
$headers = $this->buildEbayHeaders;
$connection = curl_init();
//请求的URL地址
curl_setopt($connection, CURLOPT_URL, $this->serverUrl);
//使用HTTPS协议,服务器端不需要身份验证
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, false);
//http header
curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
//设置POST请求方式
curl_setopt($connection, CURLOPT_POST, true);
//设置请求的XML内容
curl_setopt($connection, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($connection, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($connection);
curl_close($connection);
return $response;
}
}
?>
下面我们使用getUserCases接口来测试接入ebay web service,参考代码如下:
<?php
/**
* 使用getUserCases接口测试接入eBay Web Service
* 包含创建 XML格式的字符串
* 解析返回的XML格式响应
*/
/**
* 这里只是测试说明,没有将其封装成类,
* 用户可以根据自己需求,根据要使用的service封装成不同的类。
*/
set_time_limit(0);
require_once 'common/eBaySession.php';
/**
* getUserCases
* 根据ebay指定的XML元素创建XML格式字符串,POST请求到ebay
* 具体的XML元素参考http://developer.ebay.com/DevZone/resolution-case-management/CallRef/getUserCases.html
* @param string $devID 开发者ID
* @param string $appID 应用ID
* @param string $certID 应用ID
* @param string $compatabilityLevel API版本
* @param string $siteID ebay站点ID 如(0 = US, 2 = Canada, 3 = UK, ...)
* @param string $userToken 应用的访问令牌
* @param string $serverUrl 请求的URL
* @param int $pageNumber 请求记录的页码
* @return string ebay返回的XML响应字符串
*/
function getUserCases($devID, $appID, $certID, $compatabilityLevel, $siteID, $userToken, $serverUrl,$pageNumber){
//创建XML格式字符串
//具体XML元素请参考文档说明http://developer.ebay.com/DevZone/resolution-case-management/CallRef/getUserCases.html
//这里不做重复说明
$requestXmlBody = '<?xml version="1.0" encoding="utf-8" ?>';
$requestXmlBody .= '<getUserCasesRequest xmlns="http://www.ebay.com/marketplace/resolution/v1/services">';
$requestXmlBody .= "<caseStatusFilter>";
$requestXmlBody .= "<caseStatus>ELIGIBLE_FOR_CREDIT</caseStatus>";
$requestXmlBody .= "<caseStatus>MY_PAYMENT_DUE</caseStatus>";
$requestXmlBody .= "<caseStatus>MY_RESPONSE_DUE</caseStatus>";
$requestXmlBody .= "<caseStatus>OPEN</caseStatus>";
$requestXmlBody .= "<caseStatus>OTHER_PARTY_RESPONSE_DUE</caseStatus>";
$requestXmlBody .= "</caseStatusFilter>";
$requestXmlBody .= "<caseTypeFilter>";
$requestXmlBody .= "<caseType>EBP_INR</caseType>";
$requestXmlBody .= "<caseType>EBP_SNAD</caseType>";
$requestXmlBody .= "<caseType>INR</caseType>";
$requestXmlBody .= "<caseType>PAYPAL_INR</caseType>";
$requestXmlBody .= "<caseType>PAYPAL_SNAD</caseType>";
$requestXmlBody .= "<caseType>RETURN</caseType>";
$requestXmlBody .= "<caseType>SNAD</caseType>";
$requestXmlBody .= "<caseType>CANCEL_TRANSACTION</caseType>";
$requestXmlBody .= "</caseTypeFilter>";
$requestXmlBody .= "<creationDateRangeFilter>";
//case会在30天状态改为close,获取两个月内的case
$requestXmlBody .= "<fromDate>".gmdate('Y-m-d\T00:00:00.000\Z',time()-3600*24*62)."</fromDate>";
$requestXmlBody .= "<toDate>".gmdate('Y-m-d\T23:59:59.000\Z',time())."</toDate>";
$requestXmlBody .= "</creationDateRangeFilter>";
$requestXmlBody .= "<paginationInput>";
$requestXmlBody .= "<entriesPerPage>200</entriesPerPage>";
$requestXmlBody .= "<pageNumber>".$pageNumber."</pageNumber>";
$requestXmlBody .= "</paginationInput>";
$requestXmlBody .= '</getUserCasesRequest>';
$session = new eBaySession($userToken, $devID, $appID, $certID, $serverUrl, $compatabilityLevel, $siteID, 'getUserCases','ResolutionCaseManagementService','getUserCases');
//发送请求给eBay
$responseXml = $session->sendHttpRequest($requestXmlBody);
if(stristr($responseXml, 'HTTP 404') || $responseXml != ''){
die('<P>Error sending request:getUserCases');
}
return $responseXml;
}
/**
* 解析返回的XML响应字符串,根据pageNumber来判断是否还有数据未完全获取
* @param string $devID 开发者ID
* @param string $appID 应用ID
* @param string $certID 应用ID
* @param string $compatabilityLevel API版本
* @param string $siteID ebay站点ID 如(0 = US, 2 = Canada, 3 = UK, ...)
* @param string $userToken 应用的访问令牌
* @param string $serverUrl 请求的URL
* @param string $responseXmlString ebay返回的XML响应字符串
* @param array 解析数据后的数据数组
*/
function parseXmlUserCases($devID, $appID, $certID, $compatabilityLevel,
$siteID, $userToken, $serverUrl,$responseXmlString){
$repeat = true; //是否需要重复获取解析
while( $repeat ){
//使用simplexml_load_string解析XML字符串,并返回 SimpleXMLElement 对象
$responseXml = simplexml_load_string($responseXmlString);
//当元素ack为Success时,说明获取数据成功
if($responseXml->ack == 'Success'){
//根据自己需要,提取所需的数据,并保存在数组中
$caseSummaryArray = $responseXml->cases->caseSummary;
foreach($caseSummaryArray as $key => $value){
$data['caseId'] = $value->caseId->id;
$data['caseType'] = $value->caseId->type;
$data['sellerUserId'] = $value->user->userId;
$data['buyerUserId'] = $value->otherParty->userId;
$data['caseStatus'] = $value->status-> children();
$data['itemId'] = $value->item->itemId;
$data['itemTitle'] = $value->item->itemTitle;
$data['transactionId'] = $value->item->transactionId;
//$data['caseQuantity'] = $value->caseQuantity;
$caseCurrency = $value->caseAmount->attributes();//提取元素属性
$data['caseCurrency'] = $caseCurrency['currencyId'];
$data['caseAmount'] = $value->caseAmount;
$data['respondByDate'] = $value->respondByDate;
$data['creationDate'] = $value->creationDate;
$data['lastModifiedDate'] = $value->lastModifiedDate;
$allData[] = $data;
}
$paginationOutput = $responseXml->paginationOutput;
$pageNumber = $paginationOutput->pageNumber;//当前返回的页码
$totalPages = $paginationOutput->totalPages;//总页数
//根据返回的页码和页数,判断是否需要继续发送请求
if(intval($pageNumber) < intval($totalPages)){
$pageNumberNext = intval($pageNumber, 10) + 1;
$responseXmlString=getUserCases($devID, $appID, $certID, $compatabilityLevel,$siteID, $userToken, $serverUrl,$pageNumberNext);
$repeat = true;
}else{
$repeat = false;
}
}else{
$repeat = false;
}
}
return $allData;
}
$devID = '你的devID';
$appID = '你的appID';
$certID = '你的certID';
$serverUrl ='https://svcs.ebay.com/services/resolution/v1/ResolutionCaseManagementService';
$userToken = '你的Token';
//SiteID = 0 (US) - UK = 3, Canada = 2, Australia = 15, ....
$siteID = 'eBay siteID';
$compatabilityLevel = 811;
$pageNumber = 1;
$responseXmlString=getUserCases($devID, $appID, $certID, $compatabilityLevel,$siteID, $userToken, $serverUrl,$pageNumber);
//解析casexml
$allData = parseXmlUserCases($devID, $appID, $certID, $compatabilityLevel,$siteID, $userToken, $serverUrl,$responseXmlString);
echo "<pre>";
print_r($allData);
?>
以上就是访问eBay Web Service调用API的方式。
下面,我们简单介绍下,要接入eBay API Web Service,需要经过的步骤:
(1)在开发者网站 http://developer.ebay.com,申请开发者账号,得到DevID(开发者ID),AppID(应用ID),certID(验证ID).
(2)获取授权令牌Token。
(3)建立工程,链接eBay API Web Service。
(4)访问Web Service,调用API 。
在之前的博文中有提到淘宝是如何授权登录的,ebay的授权有些类似,流程如下:
(1)使用GetSessionID接口 获取Session ID
(2)使用session ID构造指定的URL,转到此URL,让用户登陆。
(3)用户登陆完成后,点击 ‘I agrees’。
(4)返回程序页面(由开发者网站后台设置返回URL,必须为SSL),通过传递回来的secret ID 和 session ID 通过 FetchToken 接口得到Token。