回顾篇:使用XML/HTTPS接入eBay Web Service

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇