2016-11-29 1 views
2

Ich versuche, die Liste der Aufträge über das MWS Scratchpad zu bekommen. Im Scratchpad funktioniert alles gut.Amazon MWS ListOrders von Scratchpad auf Anfrage

Der HTTP POST ist

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 

und die Zeichenfolge (in der zweiten Box) zu unterzeichnen

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 

Die Ergebnisse, die die Scratchpad recht zeigt.

Was ich tun möchte, ist, die Anfrage über PHP zu machen und das Ergebnis auszuarbeiten.

Aber wenn ich die Faust versuchen, die Anfrage in meinem Browser zu setzen wie

https://mws.amazonservices.it/Orders/2013-09-01?AWSAccessKeyId= $ CHIAVE_ACCESSO & Action = ListOrders & MarketplaceId = APJ6JRA9NG5V4 & sellerID = $ SELLER_ID & SignatureMethod = HMACSHA256 & SignatureVersion = 2 & Timestamp = 2016- 11-29T19% 3A13% 3A01.000Z & Version = 2013-09-01 & Signature = Q9Xnr9JhtkzeLUAsCFKPln8SS34FkCQRmELE2WiIhPo% 3D & CreatedAfter = 2016-10-31T23% 3A00% 3A00Z

der Fehler error

Die Methode I, die Signatur erstellen verwendet wurde, auf Stackoverflow finden und ist folgende:

$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)); 

Was mache ich falsch?

Antwort

0

Die Reihenfolge der Parameter ist wichtig.

Hier ist ein Beispielcode, der Ihnen einen guten Startplatz geben soll. Sie müssen es nur leicht an Ihr System anpassen.

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

Haben Sie sich die PHP client library für die Bestellungen API angesehen? Ich benutze die C# Version, aber ich würde annehmen, dass die PHP Bibliothek ähnlich ist. Die meiste Arbeit ist für dich erledigt.

+0

sah ich es, aber es scheint ein wenig veraltet, weil letzte Änderung Datum 2013 ... – Martina

+0

es wurde zuletzt eigentlich in der Nähe von Ende 2015 aktualisiert, auf dem Code schaut nur nach innen. Die Client-Bibliothek basiert auf der neuesten Version der API, von der 2013 stammt. – ScottG