MWS Feeds Update Quantities in php - Amazon
Asked Answered
P

1

7

it's a few days that I am trying to update the quantity of inventory on Amazon through php and Amazon MWS in php (without using MWS APIs because in my opinion are out of dated)

Here is my code:

$param = array();
    $param['AWSAccessKeyId']     = $this->CHIAVE_ACCESSO;
    $param['Action']             = 'SubmitFeed';
    $param['Merchant']           = $this->SELLER_ID;
    $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';
    $params['MarketplaceId.Id.1'] = $this->MARCKETPLACE_IT;
    $params['MarketplaceId.Id.2'] = $this->MARCKETPLACE_UK;
    $params['MarketplaceId.Id.3'] = $this->MARCKETPLACE_ES;
    $params['MarketplaceId.Id.4'] = $this->MARCKETPLACE_DE;
    $params['MarketplaceId.Id.5'] = $this->MARCKETPLACE_FR;
    $param['PurgeAndReplace']    = 'false';


    foreach ($param as $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 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
                    <Header>
                    <DocumentVersion>1.01</DocumentVersion>
                    <MerchantIdentifier>' .$this->SELLER_ID. '</MerchantIdentifier>
                    </Header>

                    <MessageType>Inventory</MessageType>
                    <Message>
                    <MessageID>1</MessageID>
                    <OperationType>Update</OperationType>
                    <Inventory>
                    <SKU>'.$sku.'</SKU>
                    <Quantity>'.$qty.'</Quantity>
                    </Inventory>
                    </Message>
                    </AmazonEnvelope>';

    sort($url);

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

    $sign  = 'POST' . "\n";
    $sign .= 'mws.amazonservices.it' . "\n";
    $sign .= '/Feeds/'.$param['Version'].'' . "\n";
    $sign .= $arr;

    $signature      = hash_hmac("sha256", $sign, $this->secretKey, 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.it/Feeds/".$param['Version']."?";
    $link .= $arr . "&Signature=" . $signature;

    echo $link;

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

    echo '<pre>';
    print_r($response); //xml response

The response is

50691017150_POST_INVENTORY_AVAILABILITY_DATA_2016-12-15T10:00:09+00:00_SUBMITTED_47843855-c5fb-4db9-bc3c-1ccd0aff4169

But When I go on the Amazon Inventory I cannot see any changes. I've tried also to wait some days but nothing changes. What I'm doing wrong?

Thanks in advance for help!

Using MWS Scratchpad the error I have is the following

<?xml version="1.0" encoding="UTF-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
    <DocumentVersion>1.02</DocumentVersion>
    <MerchantIdentifier>A2PDC8GCZHAL2D</MerchantIdentifier>
</Header>
<MessageType>ProcessingReport</MessageType>
<Message>
    <MessageID>1</MessageID>
    <ProcessingReport>
        <DocumentTransactionID>50691017150</DocumentTransactionID>
        <StatusCode>Complete</StatusCode>
        <ProcessingSummary>
            <MessagesProcessed>1</MessagesProcessed>
            <MessagesSuccessful>0</MessagesSuccessful>
            <MessagesWithError>1</MessagesWithError>
            <MessagesWithWarning>0</MessagesWithWarning>
        </ProcessingSummary>
        <Result>
            <MessageID>1</MessageID>
            <ResultCode>Error</ResultCode>
            <ResultMessageCode>13013</ResultMessageCode>
            <ResultDescription>This SKU does not exist in the Amazon.com catalog. Your inventory data was not processed. For reasons why, and help fixing this, see http://sellercentral.amazon.it/gp/errorcode/13013</ResultDescription>
            <AdditionalInfo>
                <SKU>887235757035</SKU>
            </AdditionalInfo>
        </Result>
    </ProcessingReport>
</Message>

but this sku exists in my catalog

Perice answered 15/12, 2016 at 10:11 Comment(0)
R
4

The actual response is alway XML from MWS, where you can see that 50691017150 is actually your FeedSubmissionId.

When you submit a feed MWS gives you back with a FeedSubmissionId, by which you can track what happened to your feed.

If you go to MWS Scratchpad, you can get the feed result.
Enter the required credentials in Authentication form and select feed as Sezione AP and GetFeedSubmissionResult as Operation.

You will be than asked for FeedSubmissionId which you already have. See what happened to that feed and why did it fail?

You are passing Marketplace Ids , which means that the sku is available there. But in your case it might not be available in any one of these. And MarketplaceId is optional, you can remove

$params['MarketplaceId.Id.1'] = $this->MARCKETPLACE_IT;
$params['MarketplaceId.Id.2'] = $this->MARCKETPLACE_UK;
$params['MarketplaceId.Id.3'] = $this->MARCKETPLACE_ES;
$params['MarketplaceId.Id.4'] = $this->MARCKETPLACE_DE;
$params['MarketplaceId.Id.5'] = $this->MARCKETPLACE_FR;
Regulator answered 20/12, 2016 at 13:4 Comment(2)
thank you very much, now I have the error...can you please help me another second? the error says me that "This SKU does not exist in the Amazon.com catalog. Your inventory data was not processed. For reasons why, and help fixing this, see sellercentral.amazon.it/gp/errorcode/13013" But in my catalog inventory the sku I used to send the request exists. Also if I make a search in inventory datatable and put this sku, I have the result...Perice
ok this evening I will try. In case there is errors I will ask another quesion.Perice

© 2022 - 2024 — McMap. All rights reserved.