2016-11-29 20 views
2

私はMWS Scratchpadで注文リストを取得しようとしています。 スクラッチパッドですべて正常に動作します。Amazon MWS ListOrders from 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 

であり、(2番目のボックスで)署名する文字列がスクラッチパッドが正しい示す

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 &版= = Q9Xnr9JhtkzeLUAsCFKPln8SS34FkCQRmELE2WiIhPo%3D & CreatedAfter 2013年9月1日&署名= 2016-10-31T23%3A00%3A00Z

エラーが error

私はstackoverflowの上で見つけた署名を作成するために使用される方法であり、以下である:私は間違っ

$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

Orders APIのPHP client libraryを見ましたか?私はC#のバージョンを使用しますが、私はPHPライブラリが似ていると仮定します。ほとんどの作業はあなたのために行われます。

+0

私はそれを見たが、最後の更新は日付2013年にあるので、... – Martina

+0

実際にそれが2015年の終わり近くに、最後に更新された日付のうち、少しだ、ちょうど内部のコードを見てください。クライアントライブラリは2013年のAPIの最新バージョンに基づいています。 – ScottG

関連する問題