wpforge
Goto Top

Amazon API - Versandupdate

Ich versuche über die Amazon API Trackingnummern für den Versand zu hinterlegen.
Bisher versuche ich das mit einem XML Template.
Grundsätzlich funktioniert der Code auch.
Allerdings scheint das XML Mist zu sein.
Amazon bietet auch die Möglichkeit ein CSV File zu übermitteln.

Jetzt habe ich mal gelernt, dass man Dateien als GET oder POST Feld übermittelt.
Das ist unten gelisteten Code offensichtlich nicht so.
Und ich muss zugeben, ganz verstanden habe ich nicht, was genau da passiert.

Die Übermittlung des CSV Files muss auf dem gleichen Weg möglich sein.
Die Frage ist jetzt, wie bekomme ich das Fiel in einen String gewandelt, den ich so übermitteln kann?

Danke schonmal für eure Antworten.

$param= array();
$param['AWSAccessKeyId']     = $amazonAWSAccessKeyId;  
$param['Action']             = 'SubmitFeed';  
$param['Merchant']           = $amazonSellerId;  
$param['FeedType']       = '_POST_INVENTORY_AVAILABILITY_DATA_';  
$param['SignatureMethod']    = 'HmacSHA256';  
$param['SignatureVersion']   = '2';  
$param['Timestamp']          = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z",time());  
$param['Version']            = '2009-01-01';  
$param['PurgeAndReplace']    = 'false';  

$secret= $amazonSecretKey;

$url= array();
foreach ($paramas $key=> $val){

    $key= str_replace("%7E","~",rawurlencode($key));  
    $val= str_replace("%7E","~",rawurlencode($val));  
    $url= "{$key}={$val}";  
}

$amazon_feed= '<?xml version="1.0" encoding="UTF-8"?>  
<AmazonEnvelope xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>'.$amazonSellerId.'</MerchantIdentifier>  
</Header>
<MessageType>OrderFulfillment</MessageType>
'.$xml.'  
</AmazonEnvelope>';  

sort($url);

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

$sign  = 'POST' . "\n";  
$sign.= 'mws.amazonservices.de' . "\n";  
$sign.= '/Feeds/'.$param['Version'].'' . "\n";  
$sign.= $arr;
if(isset($_GET['DEBUG'])&& $_GET['DEBUG']== "1")echo $amazon_feed;  
$signature      = hash_hmac("sha256",$sign,$secret,true);  
$httpHeader     =   array();
$httpHeader   =   'Transfer-Encoding: chunked';  
$httpHeader   =   'Content-Type: application/xml';  
$httpHeader   =   'Content-MD5: ' . base64_encode(md5($amazon_feed,true));  
//$httpHeader   =   'x-amazon-user-agent: MyScriptName/1.0'; 
$httpHeader   =   'Expect:';  
$httpHeader   =   'Accept:';  

$signature      = urlencode(base64_encode($signature));

$link  = "https://mws.amazonservices.de/Feeds/".$param['Version']."?";  
$link.= $arr. "&Signature=" . $signature;  

if(!isset($_GET['DEBUG']))  
{
    $ch= curl_init($link);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$httpHeader);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$amazon_feed);
    $response= curl_exec($ch);
    $info= curl_getinfo($ch);
    $errors=curl_error($ch);
    curl_close($ch);

    $resArr= explode("_",$response);  
    if(intval($resArr)> 0)
    {
        echo $resArr;
    }else{
        echo print_r($response);
    }
}

Content-Key: 313804

Url: https://administrator.de/contentid/313804

Printed on: April 20, 2024 at 02:04 o'clock

Member: StefanKittel
StefanKittel Aug 28, 2016 at 16:09:09 (UTC)
Goto Top
Hallo,

aktuell überträgt Dein Beispiel die Daten per POST mit CURL.

Hier kommt Dein Feed in die Variable $httpHeader
$httpHeader = 'Content-MD5: ' . base64_encode(md5($amazon_feed,true));

Hier wird diese Variable 2x an CURL übergeben
curl_setopt($ch,CURLOPT_HTTPHEADER,$httpHeader);
curl_setopt($ch,CURLOPT_POSTFIELDS,$amazon_feed);

CURL soll POST verwenden
curl_setopt($ch,CURLOPT_POST,1);

Und ab geht die Post
$response= curl_exec($ch);
Member: WPFORGE
WPFORGE Aug 28, 2016 at 16:44:47 (UTC)
Goto Top
Soweit war ich schon:
$httpHeader = 'Content-MD5: ' . base64_encode(md5($amazon_feed,true));

$amazon_feed wäre ja dann ein String.
Aber wie bekomme ich das csv File da rein? file_get_contents() wird nicht sein befürchte ich.
Member: StefanKittel
Solution StefanKittel Aug 28, 2016 at 16:47:36 (UTC)
Goto Top
Doch, so einfach.
Mit file_get_contents die Datei in einen String einlesen und mit base64_encode für die Verwendung sichern.
Mitglied: 129813
129813 Aug 28, 2016 updated at 17:15:04 (UTC)
Goto Top
Hi.
Zitat von @WPFORGE:

Soweit war ich schon:
$httpHeader = 'Content-MD5: ' . base64_encode(md5($amazon_feed,true));

$amazon_feed wäre ja dann ein String.
Aber wie bekomme ich das csv File da rein? file_get_contents() wird nicht sein befürchte ich.
This is only the header-field with the hash of the file face-wink not the content field!
You should the download the API Demos:
https://developer.amazonservices.de/doc/bde/feeds/v20090101/php.html
and follow the examples inside the zip file.

Reading is the first key to success!

Regards
Member: WPFORGE
WPFORGE Sep 01, 2016 at 06:27:06 (UTC)
Goto Top
Vielen Dank.
Es war tatsächlich SO einfach;)
Der Code funktioniert jetzt.