Requisitos

🚧

Atenção

Este caso de uso em PHP utiliza uma biblioteca não oficial da Amazon para os desenvolvedores.

1. Introdução

Aqui iremos configurar o ambiente PHP que será utilizado.

  • Crie uma pasta chamada "sp-api-php"
  • Entre em sua pasta pelo "Terminal"
  • Em seu terminal, digite composer init
  • Digite composer require jlevers/selling-partner-api

2. Crie seu arquivo index.php

Vamos criar seu arquivo de configuração com as credenciais da Amazon para conectar na SP-API e fazer chamadas.

require_once(__DIR__ . '/vendor/autoload.php');

$config = new SellingPartnerApi\Configuration([
  "lwaClientId" => "amzn1.application-oa2-client.7a...",
  "lwaClientSecret" => "53088f253559d77294ed1...",
  "lwaRefreshToken" => "Atzr|IwEBIG86XyQIu5fy...",
  "awsAccessKeyId" => "AKIAU...",
  "awsSecretAccessKey" => "ElWOB...",
  "endpoint" => SellingPartnerApi\Endpoint::NA,  // or another endpoint from lib/Endpoints.php
  "roleArn" => "arn:aws:iam::452196458992:role/sp-api"
]);

$api = new \SellingPartnerApi\Api\SellersApi($config);

try {
  $result = $api->getMarketplaceParticipations();
  echo json_encode($result->getPayload());
} catch (Exception $e) {
  echo 'Exception when calling OrdersApi->getOrderBuyerInfo: ', $e->getMessage(), PHP_EOL;
}

3. Abra seu terminal.

Inicie seu servidor HTTP - para isso use o seguinte comando no seu terminal:
php -S localhost:8000

4. Agora vá para seu browser.

Acesse o endereço que criamos.
http://localhost:8000

5. O resultado

Você deve ter o seguinte retorno.
Este é o retorno do endpoint MarketPlaceParticipation, que indica se você esta conectado.

[
  {
    "marketplace": {
      "id": "A2Q3Y263D00KWC",
      "name": "Amazon.com.br",
      "countryCode": "BR",
      "defaultCurrencyCode": "BRL",
      "defaultLanguageCode": "pt_BR",
      "domainName": "www.amazon.com.br"
    },
    "participation": {
      "isParticipating": true,
      "hasSuspendedListings": false
    }
  }
]

Criar documento de Feed (createFeedDocument).

Cria um documento de feed para enviar dados para SP-API.
Mais detalhes sobre o createFeedDocument

const CONTENT_TYPE = "text/xml";
$feedsApi = new FeedsApi($config);

// Criando feedDocument
$createFeedDocSpec = new Feeds\CreateFeedDocumentSpecification(["content_type" => CONTENT_TYPE]);
$feedDocumentInfo = $feedsApi->createFeedDocument($createFeedDocSpec);
print_r(json_encode($feedDocumentInfo->getPayload()->jsonSerialize()));

// Pegando dados do arquivo
$documentContents = file_get_contents("./files/Product.xsd");

// Enviando arquivo para SP-API
$docToUpload = new SellingPartnerApi\Document($feedDocumentInfo->getPayload(), CONTENT_TYPE);
$docToUpload->upload($documentContents);

Após criar um feedDocument, você deve enviar um arquivo XML, contendo os dados do mesmo.

Neste exemplo usamos o feed de produto .
Este feed normalmente é utilizado para o processo de envio ou atualização de produtos na Amazon.
Você pode encontrar todos os tipos de arquivos para feedDocuments AQUI

{
  "feedDocumentId": "amzn1.tortuga.3.920614b0-fc4c-4393-b0d9-fff175300000.T29XK4YL08B2VM",
  "url": "https://tortuga-prod-na.s3.amazonaws.com/%2FNinetyDays/amzn1.tortuga.3.920614b0-fc4c-4393-b0d9-fff175300000.T29XK4YL08B2VM?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200919T035824Z&X-Amz-SignedHeaders=<headers>&X-Amz-Expires=300&X-Amz-Credential=<credential>&X-Amz-Signature=<signature>"
}

Criar Feed (createFeed)

Para criar um feed você deve especificar as informações obrigatórias.
input_feed_document_id - Retorno do "createFeedDocument"
Mais detalhes sobre o createFeedDocument

$api = new SellingPartnerApi\Api\FeedsApi($config);

$body = new \SellingPartnerApi\Model\Feeds\CreateFeedSpecification([
  'feed_type' => 'POST_PRODUCT_PRICING_DATA', // https://amazon-br-dx.readme.io/reference/tipos-de-feeds
  'marketplace_ids' => ['A2Q3Y263D00KWC'], // https://docs.developer.amazonservices.com/en_US/dev_guide/DG_Endpoints.html
  'input_feed_document_id' => 'amzn1.tortuga.3.53ec0e07-112a-4569-9f75-23dwfbfef2.dngmn65231x',
  'feed_options' => null,
]);

try {
  $result = $api->createFeed($body);
  print_r($result);
} catch (Exception $e) {
  echo '<h2>Error:</h2> ';
  echo $e->getMessage();
}

A resposta da API deve te retornar um "feed_id", esse ID será usado no próximo passo.

SellingPartnerApi\Model\Feeds\CreateFeedResponse Object(
  [container:protected] => Array (
    [payload] => SellingPartnerApi\Model\Feeds\CreateFeedResult Object (
      [container:protected] => Array(
        [feed_id] => 50443018788
      )
    )[errors] =>
  )
)

Após criar um feedDocument, você deve fazer enviar um arquivo XML contendo os dados do mesmo.

Você pode encontrar todos os tipos de arquivos para feedDocuments AQUI

Obter Feed (getFeed)

Você precisa chamar o getFeed para gerar o feed.
feed_id - Retorno do "createFeed"
Mais detalhes sobre o getFeed.

❗️

Atenção

Esse passo é essencial para criar efetivamente um feed.

$apiInstance = new SellingPartnerApi\Api\FeedsApi($config);
$feed_id = '50059018790';

try {
  $result = $apiInstance->getFeed($feed_id);
  print_r($result);
} catch (Exception $e) {
  echo '<h2>Error:</h2>';
  echo 'Exception when calling FeedsApi->getFeed: ', $e->getMessage(), PHP_EOL;
}

A resposta da API deve te retornar um "feed" completo, no próximo passo iremos usar o campo "result_feed_document_id".

SellingPartnerApi\Model\Feeds\GetFeedResponse Object(
  [container:protected] => Array(
    [payload] => SellingPartnerApi\Model\Feeds\Feed Object(
      [container:protected] => Array(
        [feed_id] => 50443018788 
        [feed_type] => POST_PRODUCT_PRICING_DATA
        [marketplace_ids] => Array(
          [0] => A2Q3Y093F00KWC 
        )
        [created_time] => DateTime Object(
          [date] => 2021-06-10 14:05:57.000000
          [timezone_type] => 1 
          [timezone] => +00:00 
        ) 
        processing_status] => DONE 
        [processing_start_time] => DateTime Object( 
          [date] => 2021-06-10 14:06:05.000000 
          [timezone_type] => 1 [timezone] => +00:00 
        ) 
        [processing_end_time] => DateTime Object( 
          [date] => 2021-06-10 14:06:34.000000 
          [timezone_type] => 1 [timezone] => +00:00 
        ) 
        [result_feed_document_id] => amzn1.tortuga.3.13a7fb1e-1cfb-49e2-82c4-cb746aeg1933.TOQNE64XUD8TD 
      ) 
    ) [errors] => 
  ) 
)

Obter documento de Feed (getFeedDocument)

Você precisa chamar o getFeedDocument para gerar o feed
feed_document_id - Retorno do "getFeed"
Mais detalhes sobre o getFeedDocument

$api = new SellingPartnerApi\Api\FeedsApi($config);
$feed_document_id = 'amzn1.tortuga.3.53ec0e07-112a-4569-9f75-23dwfbfef2.dngmn65231x';

try {
  $result = $api->getFeedDocument($feed_document_id);
  print_r($result);
} catch (Exception $e) {
  echo '<h2>Error:</h2> ';
  echo $e->getMessage();
}

Obter Feeds (getFeeds)

Documentação sobre o getFeeds

$apiInstance = new SellingPartnerApi\Api\FeedsApi($config);
$feed_types = array('POST_PRODUCT_PRICING_DATA');
$marketplace_ids = array('A2Q3Y263D00KWC'); // 0 => Brasil

try {
  $result = $apiInstance->getFeeds($feed_types, $marketplace_ids);
  echo json_encode($result->getPayload());
} catch (Exception $e) {
  echo 'Exception when calling FeedsApi->getFeeds: ', $e->getMessage(), PHP_EOL;
}

A resposta deve trazer todos os feeds.

[
  {
    "feedId": "50073018788",
    "feedType": "POST_PRODUCT_PRICING_DATA",
    "marketplaceIds": [
    "A2Q3Y263D00KWC"
    ],
    "createdTime": "2021-06-10T14:05:57+00:00",
    "processingStatus": "DONE",
    "processingStartTime": "2021-06-10T14:06:05+00:00",
    "processingEndTime": "2021-06-10T14:06:34+00:00",
    "resultFeedDocumentId": "amzn1.tortuga.3.13a7fb1e-1cfb-49e2-82c4-cb756iaa0833.TOQNE64XUD8TD"
  },
  {
    "feedId": "50059018787",
    "feedType": "POST_PRODUCT_PRICING_DATA",
    "marketplaceIds": [
    "A2Q3Y263D00KWC"
    ],
    "createdTime": "2021-06-09T19:43:15+00:00",
    "processingStatus": "DONE",
    "processingStartTime": "2021-06-09T19:43:21+00:00",
    "processingEndTime": "2021-06-09T19:43:48+00:00",
    "resultFeedDocumentId": "amzn1.tortuga.3.a8733fcb-571d-4fb4-a937-cb757iaa0833.T2RLBPZ2SIQG4Y"
  }
]

Cancelar Feed (cancelFeed)

Documentação sobre o cancelFeed

$apiInstance = new SellingPartnerApi\Api\FeedsApi($config);
$feed_id = '50059018775';

try {
  $result = $apiInstance->cancelFeed($feed_id);
  print_r($result);
} catch (Exception $e) {
  echo 'Exception when calling FeedsApi->cancelFeed: ', $e->getMessage(), PHP_EOL;
}

❗️

Atenção

Só é possível cancelar um feed se seu "processingStatus" estiver como "IN_QUEUE"