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,...) * @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,...) * @param string $userToken 应用的访问令牌 * @param string $serverUrl 请求的URL * @param int $pageNumber 请求记录的页码 * @return string ebay返回的XML响应字符串 */ function getUserCases($devID,$appID,$certID,$siteID,$userToken,$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,'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,...) * @param string $userToken 应用的访问令牌 * @param string $serverUrl 请求的URL * @param string $responseXmlString ebay返回的XML响应字符串 * @param array 解析数据后的数据数组 */ function parseXmlUserCases($devID,$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,$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,$pageNumber); //解析casexml $allData = parseXmlUserCases($devID,$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。