Ebay E邮宝API开发

开发者专区(总入口)
http://www.ebay.cn/developer/
国际e邮宝API V3
http://www.ebay.cn/developer/single/epacket.html
国际e邮宝API V4 (eBay亚太物流平台API)
http://www.ebay.cn/developer/single/APAC-SHIPPING.html
说明:V3还可用,以后全面转换成V4(原计划是2014-10-10,后推迟)

1 注册开发者账户
https://developer.ebay.com/devzone/account
在My Account页获取生成一组Key(分开发环境 和 生产环境)

2 注册Sandbox账户
打开www.sandbox.ebay.com,点击Get Started下的eBay Sandbox User Registration链接,会跳转到developer.ebay.com,要求用开发者账户先登录,登录后跳到eBay Sandbox User Registration Tool开始注册账户,用户名统一以TESTUSER_开头,注册类型只有Buyer and Seller,说明既可以是买家,也可以是卖家,也可以再次注册一个账户,分别模拟买家卖家。

也可以登录开发者账户后在tools下点击Sandbox User Registration链接进行Sandbox账户注册。

3 产生User Token
实际就是eBay用户对开发者或APP的授权码,可以在开发账户中的Tools下面点击Get a User Token获取,点击后跳转到key选择页面,输入(或选择环境或Key),然后点击Continue to generate token,然后跳转到授权登录页面,使用之前支持的账户进行登录(表示这个账户授权到开发者账户),输入账户密码登录后跳到一个授权提醒页面,点击I agree,然后弹出结果,点击Save Token。

4 使用对应的授权码访问API(操作授权码对应的店铺)

如果刚开始接触API开发,往往在账户授权这里被卡住,有点难理解。实际上,这里申请的开发者账户可以看做是一个应用程序(至少是代表),现在这个应用程序要获取你账户(eBay账户或eBay账户对应的EUB)里面的信息,这里就涉及到两个问题。第一,数据如何访问,第二,如何授权这个应用程序访问这些个人数据。对第一个问题,自然是通过提供API访问了,但是访问前必须先获取授权,这就是第二个问题。关于授权,业界有成熟的解决方案OAuth 2,它用得非常普遍。但是eBay没有采用OAuth 2,它自己实现了一套授权逻辑(不过跟OAuth 2也有类似地方),过程这里先跳过了,最终结果是eBay卖家输入了它的账户密码点击同意授权,应用程序将接收到一个很长的字符串,美其名曰Token。应用程序在使用API时,这个Token是必须传递的,Token是有有效期的,会不会导致它泄露呢,理论是不会的,因为它作为POST数据的一部分通过HTTPS进行传递。就算泄露了Token,要访问API时还要知道AppKey已经对应的签名等。

以下是一段来自官方的例子:

error_reporting(E_ALL);
$compatabilityLevel = 717;    // eBay API version

$devID = "95a9c0d-1cad-4fda-b74d-b610efbb560";
$appID = "EBTCo63ba-b11-4e96-b0c3-b4dd064239";
$certID = "f2fd3c8-18d4-4419-8fd3-72ae811829f";
$serverUrl = "https://api.sandbox.ebay.com/ws/api.dll";
$userToken = "xxxxxxxxxxxxxx";

$siteID = 0;
//要调用的API
$verb = 'GetTokenStatus';
 
$headers = array (
    'X-EBAY-API-COMPATIBILITY-LEVEL: ' . $compatabilityLevel,
    'X-EBAY-API-DEV-NAME: ' . $devID,
    'X-EBAY-API-APP-NAME: ' . $appID,
    'X-EBAY-API-CERT-NAME: ' . $certID,
             
    //the name of the call we are requesting
    'X-EBAY-API-CALL-NAME: ' . $verb,           
             
    //SiteID must also be set in the Request's XML
    //SiteID = 0  (US) - UK = 3, Canada = 2, Australia = 15, ....
    //SiteID Indicates the eBay site to associate the call with
    'X-EBAY-API-SITEID: ' . $siteID,
);
 
//POST的数据,一个XML字符串
$requestXmlBody = '<?xml version="1.0" encoding="utf-8"?>
<GetTokenStatusRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <RequesterCredentials>
    <eBayAuthToken>'.$userToken.'</eBayAuthToken>
  </RequesterCredentials>
</GetTokenStatusRequest>';
 
//使用CURL发送数据        
//initialise a CURL session
$connection = curl_init();
//set the server we are using (could be Sandbox or Production server)
curl_setopt($connection, CURLOPT_URL, $serverUrl);
         
//stop CURL from verifying the peer's certificate
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
         
//set the headers using the array of headers
curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
         
//set method as POST
curl_setopt($connection, CURLOPT_POST, 1);
         
//set the XML body of the request
curl_setopt($connection, CURLOPT_POSTFIELDS, $requestXmlBody);
         
//set it to return the transfer as a string from curl_exec
curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
         
//Send the Request
$response = curl_exec($connection);
         
//close the connection
curl_close($connection);
 
header("Content-type: text/xml");
print_r($response);  

返回的XML:

<GetTokenStatusResponse><Timestamp>2014-11-19T15:16:41.219Z</Timestamp><Ack>Success</Ack><Version>893</Version><Build>E893_CORE_API_17097905_R1</Build><TokenStatus><Status>Active</Status><EIASToken>nY+sHZ2PrBmdj6wVnY+sEZ2PrA2dj6wFk4GhDJmKogudj6x9nY+seQ==</EIASToken><ExpirationTime>2016-05-12T15:04:46.000Z</ExpirationTime></TokenStatus></GetTokenStatusResponse>

EBay Api顺利通过沙盒测试,但是我这里的E邮宝V4.0.0沙盒测试一直失败,起初以为是账户等信息不对,换了几次,总是提醒Token无效,但是通过EBay Api测试Token是有效的(如上代码运行结果)。后来我直接到Ebay香港注册了个真实的Ebay账户,然后授权到真实的开发者账户,测试就通过:

$serverUrl="https://api.apacshipping.ebay.com.hk/aspapi/v4/ApacShippingService";

$request=array();
$request["APIDevUserID"]="xxxxx";
$request["APISellerUserToken"]="00000";
$request["APISellerUserID"]="xxxxx";
$request["AppID"]="EBTCo1d7-1e69-4cbf-adbf-7c47209ab";
$request["AppCert"]="45d1d5c-d54c-4381-bd3b-f9b0949479";
$request["MessageID"]="";
$request["Version"]="4.0.0";
$request["Carrier"]="CNPOST";
//$request["Service"]="EPACK";

$client = new SoapClient($serverUrl."?wsdl");
$r = $client->VerifyAPACShippingUser(array("VerifyAPACShippingUserRequest"=>$request));

print_r($r);

///输出
stdClass Object
(
    [VerifyAPACShippingUserResult] => stdClass Object
        (
            [Version] => 4.0.0
            [Ack] => Success
            [Message] => VerifyAPACShippingUser succeeded
            [Timestamp] => 2014-11-20T06:58:05.989-07:00
            [InvocationID] => F4C3C334D173429BA38538986C620B1D
            [CarrierList] => stdClass Object
                (
                    [CarrierGeo] => stdClass Object
                        (
                            [Carrier] => CNPOST
                            [FromCountryCode] => CN
                        )

                )

        )

)

看起来,E邮宝v4.0.0服务还有待完善。

附加信息,E邮宝实际是一个独立的服务,是要注册账户的,你可以使用你的Ebay账户(仅限香港注册的)去注册一个E邮宝账户,这样你的这个EBay账户也就是E邮宝账户,同时你的Ebay账户默认会被添加到管理账户的卖家列表中,你可以继续添加Ebay账户进来,就是一个E邮宝账户对应多个Ebay账户,在调用E邮宝API时,参数APISellerUserID是必填的,它是能定位到E邮宝的中设置的的Ebay账户。

只要通过Ebay的API认证,就能调用E邮宝的API管理物流发货。