2016-11-29 144 views
2

我试图通过MWS Scratchpad获得订单列表。 在便签簿中一切正常。亚马逊MWS ListOrders从Scratchpad请求

的HTTP POST是

POST /Orders/2013-09-01?AWSAccessKeyId=$CHIAVE_ACCESSO 
&Action=ListOrders 
&SellerId=$SELLER_ID 
&SignatureVersion=2 
&Timestamp=2016-11-29T18%3A58%3A52Z 
&Version=2013-09-01 
&Signature=$SIGNATURE 
&SignatureMethod=HmacSHA256 
&CreatedAfter=2016-10-31T23%3A00%3A00Z 
&MarketplaceId.Id.1=APJ6JRA9NG5V4 HTTP/1.1 
Host: mws.amazonservices.it 
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript) 
Content-Type: text/xml 

并登录(在第二个框中)的字符串是

POST 
mws.amazonservices.it 
/Orders/2013-09-01 
AWSAccessKeyId=$CHIAVE_ACCESSO&Action=ListOrders&CreatedAfter=2016-10-31T23%3A00%3A00Z&MarketplaceId.Id.1=APJ6JRA9NG5V4&SellerId=$SELLER_ID&Signat ureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-11-29T18%3A58%3A52Z&Version=2013-09-01 

表示暂存器是正确的结果。

我想要做的是通过PHP提出请求并详细说明结果。

,但如果我的拳头试图把请求我的浏览器,如

https://mws.amazonservices.it/Orders/2013-09-01?AWSAccessKeyId= $ CHIAVE_ACCESSO &行动= ListOrders & MarketplaceId = APJ6JRA9NG5V4 & SellerId = $ SELLER_ID &是SignatureMethod = HmacSHA256 & SignatureVersion = 2 &时间戳= 2016- 11-29T19%3A13%3A01.000Z &版本= 2013年9月1日&签名= Q9Xnr9JhtkzeLUAsCFKPln8SS34FkCQRmELE2WiIhPo%3D & CreatedAfter = 2016-10-31T23%3A00%3A00Z

误差 error

我用来创建签名被找到计算器的方法和如下:

$sign = 'GET' . "\n"; 
$sign .= 'mws.amazonservices.it' . "\n"; 
$sign .= '/Orders/2013-09-01' . "\n"; 
$sign .= $arr; 

$signature = hash_hmac("sha256", $sign, $CHIAVE_SEGRETA, true); 
$signature = urlencode(base64_encode($signature)); 

我做错了吗?

回答

0

参数的顺序很重要。

下面是一些示例代码,应该给你一个开始的好地方。你只需要稍微修改它以适应你的系统。

class AmazonMWS 
{ 
    private $secretKey = ''; 

    private $parameters = array(); 

    /** 
    * Constructor for the AmazonMWS class. 
    * Initializes constants. 
    */ 
    public function __construct() 
    { 
     $this->secretKey = Constant::get('SECRET_KEY'); 

     $this->parameters['AWSAccessKeyId']  = Constant::get('AWSAccessKeyId'); 
     $this->parameters['MarketplaceId.Id.1'] = Constant::get('MarketplaceId.Id.1'); 
     $this->parameters['SellerId']   = Constant::get('SellerId'); 
     $this->parameters['SignatureMethod'] = Constant::get('SignatureMethod'); 
     $this->parameters['SignatureVersion'] = Constant::get('SignatureVersion'); 
    } 

    public function setListOrders() 
    { 
     $this->parameters['Action'] = 'ListOrders'; 
     $this->parameters['Version'] = '2013-09-01'; 
     $this->parameters['Timestamp'] = $this->getTimestamp(); 

     // this part should change and depend on the method/parameter.. for now just for testing 

     $this->parameters['CreatedAfter'] = '2015-11-01'; 
    } 

    public function listOrders() 
    { 
     $request = "https://mws.amazonservices.com/Orders/2013-09-01?"; 
     $request .= $this->getParameterString($this->parameters) . "&Signature=" . $this->calculateSignature($this->calculateStringToSign($this->parameters)); 

     echo $request; 

     return Curl::fetchSSL($request); 
    } 

    /** 
    * Calculates String to sign. 
    * 
    * @param array $parameters request parameters 
    * @return String to sign 
    */ 
    protected function calculateStringToSign(array $parameters) 
    { 
     $stringToSign = 'GET' . "\n"; 
     $stringToSign .= 'mws.amazonservices.com' . "\n"; 
     $stringToSign .= '/Orders/2013-09-01' . "\n"; 
     $stringToSign .= $this->getParameterString($parameters); 

     return $stringToSign; 
    } 

    /** 
    * Gets the query parameters as a String sorted in natural-byte order. 
    * 
    * @param array $parameters request parameters 
    * @return String of parameters 
    */ 
    protected function getParameterString(array $parameters) 
    { 
     $url = array(); 
     foreach ($parameters as $key => $val) { 
      $key = $this->urlEncode($key); 
      $val = $this->urlEncode($val); 
      $url[] = "{$key}={$val}"; 
     } 
     sort($url); 

     $parameterString = implode('&', $url); 

     return $parameterString; 
    } 

    /** 
    * Computes RFC 2104-compliant HMAC signature. 
    * 
    * @param String to sign 
    */ 
    protected function calculateSignature($stringToSign) 
    { 
     $signature = hash_hmac("sha256", $stringToSign, $this->secretKey, true); 
     return urlencode(base64_encode($signature)); 
    } 

    /** 
    * URL encodes a string. 
    */ 
    protected function urlEncode($string) 
    { 
     return str_replace("%7E", "~", rawurlencode($string)); 
    } 

    /** 
    * Gets the current date as ISO 8601 timestamp 
    */ 
    protected function getTimestamp() 
    { 
     return gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()); 
    } 
} 
0

你看过订单API的PHP client library吗?我使用C#版本,但我会假设PHP库是类似的。大部分工作都是为你完成的。

+0

我看到了它,但它似乎有点过时了,因为上次更新日期2013 ... – Martina

+0

其实这是最后一次接近2015年底更新的,只是看里面的代码。客户端库基于最新版本的API,这是2013年的来源。 – ScottG