Sample code for 30+ languages & platforms
PHP ActiveX

Amazon SP-API Get Specific Order

See more Amazon SP-API Examples

Get a specific Amazon Seller order.

Chilkat PHP ActiveX Downloads

PHP ActiveX
<?php

$success = 0;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

// Gets information for this order ID
// The order ID is something like "902-1845936-5435065" and it is the AmazonOrderId returned in the JSON when getting the list of orders.  For example:
// {
//   "payload": {
//     "CreatedBefore": "1.569521782042E9",
//     "Orders": [
//       {
//         "AmazonOrderId": "902-1845936-5435065",
//         "PurchaseDate": "1970-01-19T03:58:30Z",
// ...

// However, when using the sandbox, instead use the explicit keyword TEST_CASE_200
$orderId = 'TEST_CASE_200';

$authAws = new COM("Chilkat.AuthAws");
$authAws->AccessKey = 'AWS_ACCESS_KEY';
$authAws->SecretKey = 'AWS_SECRET_KEY';
$authAws->ServiceName = 'execute-api';
// Use the region that is correct for your needs.
$authAws->Region = 'eu-west-1';

// First get a restricted data token for the given order ID.
// This requires an LWA access token which cannot be more than 1 hour old.
// See Fetch SP-API LWA Access Token
$jsonLwaToken = new COM("Chilkat.JsonObject");
$success = $jsonLwaToken->LoadFile('qa_data/tokens/sp_api_lwa_token.json');
if ($success == 0) {
    print 'Failed to load LWA access token.' . "\n";
    exit;
}

// Must use the non-sandbox domain for getting the RDT.
$rest = new COM("Chilkat.Rest");
$success = $rest->Connect('sellingpartnerapi-eu.amazon.com',443,1,1);
if ($success == 0) {
    print $rest->LastErrorText . "\n";
    exit;
}

$success = $rest->SetAuthAws($authAws);

// Add the x-amz-access-token request header.
$lwa_token = $jsonLwaToken->stringOf('access_token');
$rest->ClearAllHeaders();
$rest->AddHeader('x-amz-access-token',$lwa_token);

// We're going to send a POST with the following JSON body:

// {
//   "restrictedResources": [
//     {
//       "method": "GET",
//       "path": "/orders/v0/orders/{orderId}",
//       "dataElements": ["buyerInfo", "shippingAddress"]
//     }
//   ]
// }

$sbPath = new COM("Chilkat.StringBuilder");
$sbPath->Append('/orders/v0/orders/');
$sbPath->Append($orderId);

$jsonRc = new COM("Chilkat.JsonObject");
$jsonRc->UpdateString('restrictedResources[0].method','GET');
$jsonRc->UpdateString('restrictedResources[0].path',$sbPath->getAsString());
$jsonRc->UpdateString('restrictedResources[0].dataElements[0]','buyerInfo');
$jsonRc->UpdateString('restrictedResources[0].dataElements[1]','shippingAddress');

$sbRequest = new COM("Chilkat.StringBuilder");
$jsonRc->EmitSb($sbRequest);

$sbResponse = new COM("Chilkat.StringBuilder");
$uri = '/tokens/2021-03-01/restrictedDataToken';
$success = $rest->FullRequestSb('POST',$uri,$sbRequest,$sbResponse);
if ($success == 0) {
    print $rest->LastErrorText . "\n";
    exit;
}

// Examine the response status.
$statusCode = $rest->ResponseStatusCode;
if ($statusCode != 200) {
    print 'Response status code: ' . $statusCode . "\n";
    print 'Response status text: ' . $rest->ResponseStatusText . "\n";
    print 'Response body: ' . "\n";
    print $sbResponse->getAsString() . "\n";
    print 'Failed.' . "\n";
    exit;
}

// Get the restricted data token.
$jsonResp = new COM("Chilkat.JsonObject");
$jsonResp->LoadSb($sbResponse);
$restrictedDataToken = $jsonResp->stringOf('restrictedDataToken');
print 'Restricted Data Token: ' . $restrictedDataToken . "\n";

// ------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------
// Now that we have the RDT, we can use it to get information about the order.
// 
// Yes, the SP-API is horribly tedious and painful.  You must use an RDT specifically tailored to each request requiring an RDT,
// the RDT must not be over an hour old, and if you need to get a new RDT you must get it using an LWA token that itself is not
// more than an hour old.  If the LWA is more than an hour old, you must get a new one.  Ughhh!!!!!
// ------------------------------------------------------------------------------------------------------------

// Disconnect from the non-sandbox domain.  This example will use the sandbox.
// (The RDT was obtained using the non-sandbox domain.  For some reason, the sandbox domain does not work for getting the RDT.)
$rest->Disconnect(100);

$success = $rest->Connect('sandbox.sellingpartnerapi-eu.amazon.com',443,1,1);
if ($success == 0) {
    print $rest->LastErrorText . "\n";
    exit;
}

$success = $rest->SetAuthAws($authAws);

$rest->ClearAllHeaders();
$rest->AddHeader('x-amz-access-token',$restrictedDataToken);

$rest->ClearAllQueryParams();
$rest->AddQueryParam('MarketplaceIds','ATVPDKIKX0DER');

$rest->ClearAllPathParams();
$rest->AddPathParam('{orderId}',$orderId);

$uri = '/orders/v0/orders/{orderId}';
$success = $rest->FullRequestNoBodySb('GET',$uri,$sbResponse);
if ($success == 0) {
    print $rest->LastErrorText . "\n";
    exit;
}

// Examine the response status.
$statusCode = $rest->ResponseStatusCode;
if ($statusCode != 200) {
    print 'Response status text: ' . $rest->ResponseStatusText . "\n";
    print 'Response body: ' . "\n";
    print $sbResponse->getAsString() . "\n";
    print 'Failed.' . "\n";
    exit;
}

print $sbResponse->getAsString() . "\n";

// If successful, gets a JSON response such as the following:

// {
//   "payload": {
//     "AmazonOrderId": "902-1845936-5435065",
//     "PurchaseDate": "1970-01-19T03:58:30Z",
//     "LastUpdateDate": "1970-01-19T03:58:32Z",
//     "OrderStatus": "Unshipped",
//     "FulfillmentChannel": "MFN",
//     "SalesChannel": "Amazon.com",
//     "ShipServiceLevel": "Std US D2D Dom",
//     "OrderTotal": {
//       "CurrencyCode": "USD",
//       "Amount": "11.01"
//     },
//     "NumberOfItemsShipped": 0,
//     "NumberOfItemsUnshipped": 1,
//     "PaymentMethod": "Other",
//     "PaymentMethodDetails": [
//       "Standard"
//     ],
//     "IsReplacementOrder": false,
//     "MarketplaceId": "ATVPDKIKX0DER",
//     "ShipmentServiceLevelCategory": "Standard",
//     "OrderType": "StandardOrder",
//     "EarliestShipDate": "1970-01-19T03:59:27Z",
//     "LatestShipDate": "1970-01-19T04:05:13Z",
//     "EarliestDeliveryDate": "1970-01-19T04:06:39Z",
//     "LatestDeliveryDate": "1970-01-19T04:15:17Z",
//     "IsBusinessOrder": false,
//     "IsPrime": false,
//     "IsGlobalExpressEnabled": false,
//     "IsPremiumOrder": false,
//     "IsSoldByAB": false,
//     "IsIBA": false,
//     "DefaultShipFromLocationAddress": {
//       "Name": "MFNIntegrationTestMerchant",
//       "AddressLine1": "2201 WESTLAKE AVE",
//       "City": "SEATTLE",
//       "StateOrRegion": "WA",
//       "PostalCode": "98121-2778",
//       "CountryCode": "US",
//       "Phone": "+1 480-386-0930 ext. 73824",
//       "AddressType": "Commercial"
//     },
//     "FulfillmentInstruction": {
//       "FulfillmentSupplySourceId": "sampleSupplySourceId"
//     },
//     "IsISPU": false,
//     "IsAccessPointOrder": false,
//     "AutomatedShippingSettings": {
//       "HasAutomatedShippingSettings": false
//     },
//     "EasyShipShipmentStatus": "PendingPickUp",
//     "ElectronicInvoiceStatus": "NotRequired"
//   }
// }

// Use this online tool to generate parsing code from sample JSON: 
// Generate Parsing Code from JSON

$json = new COM("Chilkat.JsonObject");

$json->LoadSb($sbResponse);

$AmazonOrderId = $json->stringOf('payload.AmazonOrderId');
$PurchaseDate = $json->stringOf('payload.PurchaseDate');
$LastUpdateDate = $json->stringOf('payload.LastUpdateDate');
$OrderStatus = $json->stringOf('payload.OrderStatus');
$FulfillmentChannel = $json->stringOf('payload.FulfillmentChannel');
$SalesChannel = $json->stringOf('payload.SalesChannel');
$ShipServiceLevel = $json->stringOf('payload.ShipServiceLevel');
$CurrencyCode = $json->stringOf('payload.OrderTotal.CurrencyCode');
$Amount = $json->stringOf('payload.OrderTotal.Amount');
$NumberOfItemsShipped = $json->IntOf('payload.NumberOfItemsShipped');
$NumberOfItemsUnshipped = $json->IntOf('payload.NumberOfItemsUnshipped');
$PaymentMethod = $json->stringOf('payload.PaymentMethod');
$IsReplacementOrder = $json->BoolOf('payload.IsReplacementOrder');
$MarketplaceId = $json->stringOf('payload.MarketplaceId');
$ShipmentServiceLevelCategory = $json->stringOf('payload.ShipmentServiceLevelCategory');
$OrderType = $json->stringOf('payload.OrderType');
$EarliestShipDate = $json->stringOf('payload.EarliestShipDate');
$LatestShipDate = $json->stringOf('payload.LatestShipDate');
$EarliestDeliveryDate = $json->stringOf('payload.EarliestDeliveryDate');
$LatestDeliveryDate = $json->stringOf('payload.LatestDeliveryDate');
$IsBusinessOrder = $json->BoolOf('payload.IsBusinessOrder');
$IsPrime = $json->BoolOf('payload.IsPrime');
$IsGlobalExpressEnabled = $json->BoolOf('payload.IsGlobalExpressEnabled');
$IsPremiumOrder = $json->BoolOf('payload.IsPremiumOrder');
$IsSoldByAB = $json->BoolOf('payload.IsSoldByAB');
$IsIBA = $json->BoolOf('payload.IsIBA');
$Name = $json->stringOf('payload.DefaultShipFromLocationAddress.Name');
$AddressLine1 = $json->stringOf('payload.DefaultShipFromLocationAddress.AddressLine1');
$City = $json->stringOf('payload.DefaultShipFromLocationAddress.City');
$StateOrRegion = $json->stringOf('payload.DefaultShipFromLocationAddress.StateOrRegion');
$PostalCode = $json->stringOf('payload.DefaultShipFromLocationAddress.PostalCode');
$CountryCode = $json->stringOf('payload.DefaultShipFromLocationAddress.CountryCode');
$Phone = $json->stringOf('payload.DefaultShipFromLocationAddress.Phone');
$AddressType = $json->stringOf('payload.DefaultShipFromLocationAddress.AddressType');
$FulfillmentSupplySourceId = $json->stringOf('payload.FulfillmentInstruction.FulfillmentSupplySourceId');
$IsISPU = $json->BoolOf('payload.IsISPU');
$IsAccessPointOrder = $json->BoolOf('payload.IsAccessPointOrder');
$HasAutomatedShippingSettings = $json->BoolOf('payload.AutomatedShippingSettings.HasAutomatedShippingSettings');
$EasyShipShipmentStatus = $json->stringOf('payload.EasyShipShipmentStatus');
$ElectronicInvoiceStatus = $json->stringOf('payload.ElectronicInvoiceStatus');
$i = 0;
$count_i = $json->SizeOfArray('payload.PaymentMethodDetails');
while ($i < $count_i) {
    $json->I = $i;
    $strVal = $json->stringOf('payload.PaymentMethodDetails[i]');
    $i = $i + 1;
}

print 'Success!' . "\n";

?>