spapi-php is a http client for Amazon's Selling Partner API
Author: Lyubomir Slavilov
Spapi is released as Composer package double-break/spapi-php with no warranties or promises.
There are couple classes (such as Signer, Credentials) which are essential for the API calls to work. Most of the issues will live here.
All of the actual API clients are autogenerated and given the disclaimer above - not heavily tested.
Now you are ready to do
composer require double-break/spapi-php
Once you have successfully installed the package, the updates are simple as normal Composer package updates. Just execute:
composer update double-break/spapi-php
| Name | Description | Type |
|---|---|---|
http |
Contains all the Guzzle configuration |
GuzzleConfiguration |
| LWA configuration | ||
refresh_token |
Value of the refresh token issued by the Seller authorizing the application | string |
client_id |
The client id which is generated in the Seller Apps console | string |
client_secret |
The client secret with which the client will identify itself | string |
access_token_longevity |
The longevity in seconds of the token. It is basically the time period in which the token will be kept in the TokenStorage |
integer Default: 3600 |
| STS configuration | ||
access_key |
The IAM role access key | string |
secret_key |
The IAM role secret key | string |
role_arn |
The ARN of the IAM role | string |
sts_session _longevity |
The longevity of the STS session which will be created | integer Default: 3600 |
| API configuration | ||
region |
The region identifier for the region you are going to execute your calls against | string Example: eu-west-1 |
host |
The region specific host of the Selling Partner API | string Example: sellingpartnerapi-eu.amazon.com |
<?php
include __DIR__ . '/vendor/autoload.php';
/** The Setup **/
$config = [
//Guzzle configuration
'http' => [
'verify' => false, //<--- NOT SAFE FOR PRODUCTION
'debug' => true //<--- NOT SAFE FOR PRODUCTION
],
//LWA: Keys needed to obtain access token from Login With Amazon Service
'refresh_token' => '<YOUR-REFRESH-TOKEN>',
'client_id' => '<CLINET-ID-IN-SELLER-CONSOLE>',
'client_secret' => '<CLIENT_SECRET>',
//STS: Keys of the IAM role which are needed to generate Secure Session
// (a.k.a Secure token) for accessing and assuming the IAM role
'access_key' => '<STS-ACCESS_KEY>',
'secret_key' => '<STS-SECRET-KEY>',
'role_arn' => '<ROLE-ARN>' ,
//API: Actual configuration related to the SP API :)
'region' => 'eu-west-1',
'host' => 'sellingpartnerapi-eu.amazon.com'
];
//Create token storage which will store the temporary tokens
$tokenStorage = new DoubleBreak\Spapi\SimpleTokenStorage('./aws-tokens');
//Create the request signer which will be automatically used to sign all of the
//requests to the API
$signer = new DoubleBreak\Spapi\Signer();
//Create Credentials service and call getCredentials() to obtain
//all the tokens needed under the hood
$credentials = new DoubleBreak\Spapi\Credentials($tokenStorage, $signer, $config);
$cred = $credentials->getCredentials();
/** The application logic implementation **/
//Create SP API Catalog client and execute one ot its REST methods.
$catalogClient = new DoubleBreak\Spapi\Api\CatalogItems($cred, $config);
//Check the catalog info for B074Z9QH5F ASIN
$result = $catalogClient->getCatalogItem('B074Z9QH5F', [
'MarketplaceId' => 'A1PA6795UKMFR9',
])['payload'];
print_r($result);
For Feed API, user can follow Feeds API Use Case Guide.
And in this guide for step 2. Encrypt and upload the feed data: user can use below example:
<?php
// content type of the feed data to be uploaded.
$contentType = 'text/xml; charset=UTF-8';
// create feed document
$feedClient = new \DoubleBreak\Spapi\Api\Feeds($cred, $config);
$response = $feedClient->createFeedDocument(["contentType" => $contentType]);
$payload = $response['payload'];
$feedContentFilePath = './testFeedDoc.xml';
$result = (new \DoubleBreak\Spapi\Helper\Feeder())->uploadFeedDocument($payload,$contentType,$feedContentFilePath);
print_r($result);
And for Step 6. Download and decrypt the feed processing report: user can use below example:
<?php
$feedClient = new \DoubleBreak\Spapi\Api\Feeds($cred, $config);
// $resultFeedDocumentId: from response of getFeed() function.
$resultFeedDocumentId = 'amzn1.tortuga.3.ed4cd0d8-447b-4c22-96b5-52da8ace1207.T3YUVYPGKE9BMY';
$response = $feedClient->getFeedDocument($resultFeedDocumentId);
$payload = $response['payload'];
$result = (new \DoubleBreak\Spapi\Helper\Feeder())->downloadFeedProcessingReport($payload);
print_r($result);
<?php
//configuration and initialization here
$catalogClinet = new DoubleBreak\Spapi\Api\Catalog($cred, $config);
try {
$result = $catalogClinet->getCatalogItem('B074Z9QH5F', [
'MarketplaceId' => 'A1PA6795UKMFR9',
])['payload'];
//do your business here
} catch (\GuzzleHttp\Exception\ClientException $e) {
$httpCode = $e->getResponse()->getStatusCode();
$errorBody = $e->getResponse()->getBody();
echo "Amazon SP API responded with HTTP {$httpCode}\n {$errorBody}";
} catch(\Exception $e) {
echo "Unexpected exception: " . $e->getMessage();
}
📝Accessing headers by using client's getLastHttpResponse() is available since v1.0.5
<?php
//configuration and initialization here
//Create SP API Catalog client and execute one ot its REST methds.
$catalogClinet = new DoubleBreak\Spapi\Api\Catalog($cred, $config);
//Check the catalog info for B074Z9QH5F ASIN
$result = $catalogClinet->getCatalogItem('B074Z9QH5F', [
'MarketplaceId' => 'A1PA6795UKMFR9',
])['payload'];
$headers = $catalogClinet->getLastHttpResponse()->getHeaders();
foreach ($headers as $headerName => $values) {
echo "{$headerName}: " . implode(','. $values);
}
📝Accessing headers by using client's getLastHttpResponse() is available since v1.0.5
<?php
//configuration and initialization here
$catalogClinet = new DoubleBreak\Spapi\Api\Catalog($cred, $config);
try {
$result = $catalogClinet->getCatalogItem('B074Z9QH5F', [
'MarketplaceId' => 'A1PA6795UKMFR9',
])['payload'];
//do your business here
} catch (\GuzzleHttp\Exception\ClientException $e) {
$headers = $e->getResponse()->getHeaders();
print_r($headers);
}
// OR
try {
$result = $catalogClinet->getCatalogItem('B074Z9QH5F', [
'MarketplaceId' => 'A1PA6795UKMFR9',
])['payload'];
//do your business here
} catch (\GuzzleHttp\Exception\ClientException $e) {
$headers = $catalogClinet->getLastHttpResponse()->getHeaders();
print_r($headers);
}
Please, see more details in Selling Partner Api docs
<?php
include __DIR__ . '/vendor/autoload.php';
/** The Setup **/
$config = [
//Guzzle configuration
'http' => [
'verify' => false,
'debug' => true
],
//LWA: Keys needed to obtain access token from Login With Amazon Service
'refresh_token' => '<YOUR-REFRESH-TOKEN>',
'client_id' => '<CLINET-ID-IN-SELLER-CONSOLE>',
'client_secret' => '<CLIENT_SECRET>',
//STS: Keys of the IAM role which are needed to generate Secure Session
// (a.k.a Secure token) for accessing and assuming the IAM role
'access_key' => '<STS-ACCESS_KEY>',
'secret_key' => '<STS-SECRET-KEY>',
'role_arn' => '<ROLE-ARN>' ,
//API: Actual configuration related to the SP API :)
'region' => 'eu-west-1',
'host' => 'sellingpartnerapi-eu.amazon.com'
];
//Create token storage which will store the temporary tokens
$tokenStorage = new DoubleBreak\Spapi\SimpleTokenStorage('./aws-tokens');
//Create the request signer which will be automatically used to sign all of the
//requests to the API
$signer = new DoubleBreak\Spapi\Signer();
//Create Credentials service and call getCredentials() to obtain
//all the tokens needed under the hood
$credentials = new DoubleBreak\Spapi\Credentials($tokenStorage, $signer, $config);
//get credentials with migration token, it's needed for /authorization/v1/authorizationCode request
$cred = $credentials->getCredentials(true);
/** The application logic implementation **/
//Create SP API Catalog client and execute one ot its REST methods.
$authorizationClient = new DoubleBreak\Spapi\Api\Authorization($cred, $config);
//Get Authorization code
$result = $authorizationClient->getAuthorizationCode([
'developerId' => '<DEVELOPER-ID-AUTHORIZED-BY-SELLING-PARTNER>',
'mwsAuthToken' => '<MWS-AUTH-TOKEN>',
'sellingPartnerId' => '<SELLING-PARTNER-ID>'
])['payload'];
//Authorization code should be changed to Access and Refresh token
print_r($credentials->exchangesAuthorizationCodeForRefreshToken($result['authorizationCode']));
Please, see more details in Selling Partner Api docs
<?php
include __DIR__ . '/vendor/autoload.php';
/** The Setup **/
$config = [
//Guzzle configuration
'http' => [
'verify' => false,
'debug' => true
],
//LWA: Keys needed to obtain access token from Login With Amazon Service
'refresh_token' => '<YOUR-REFRESH-TOKEN>',
'client_id' => '<CLINET-ID-IN-SELLER-CONSOLE>',
'client_secret' => '<CLIENT_SECRET>',
//STS: Keys of the IAM role which are needed to generate Secure Session
// (a.k.a Secure token) for accessing and assuming the IAM role
'access_key' => '<STS-ACCESS_KEY>',
'secret_key' => '<STS-SECRET-KEY>',
'role_arn' => '<ROLE-ARN>' ,
//API: Actual configuration related to the SP API :)
'region' => 'eu-west-1',
'host' => 'sellingpartnerapi-eu.amazon.com'
];
//Create token storage which will store the temporary tokens
$tokenStorage = new DoubleBreak\Spapi\SimpleTokenStorage('./aws-tokens');
//Create the request signer which will be automatically used to sign all of the
//requests to the API
$signer = new DoubleBreak\Spapi\Signer();
//Create Credentials service and call getCredentials() to obtain
//all the tokens needed under the hood
$credentials = new DoubleBreak\Spapi\Credentials($tokenStorage, $signer, $config);
//get credentials with Grantless auth token, it's needed for grantless operations request
$cred = $credentials->getCredentials('grantless');
/** The application logic implementation **/
//Create SP API Notification client and execute one ot its REST methods.
$notificationClient = new DoubleBreak\Spapi\Api\Notifications($cred, $config);
//Get notification destinations
$result = $notificationClient->getDestinations();
print_r($result['payload']);
<?php
include __DIR__ . '/vendor/autoload.php';
/** The Setup **/
$config = [
// same as examples above...
];
//Create token storage which will store the temporary tokens
$tokenStorage = new DoubleBreak\Spapi\SimpleTokenStorage('./aws-tokens');
//Create the request signer which will be automatically used to sign all of the
//requests to the API
$signer = new DoubleBreak\Spapi\Signer();
//Create Credentials service and call getCredentials() to obtain
//all the tokens needed under the hood
$credentials = new DoubleBreak\Spapi\Credentials($tokenStorage, $signer, $config);
$cred = $credentials->getRdtCredentials([
'restrictedResources' => [
[
'method' => 'GET',
'path' => '/orders/v0/orders/{orderId}/buyerInfo'
],
[
'method' => 'GET',
'path' => '/mfn/v0/shipments/{shipmentId}'
]
]
]);
/** The application logic implementation **/
//Create SP API Orders client and execute one ot its REST methods.
$orderClient = new DoubleBreak\Spapi\Api\Orders($cred, $config);
//Get order's buyer info
$result = $catalogClient->getOrderBuyerInfo('902-3159896-1390916')['payload'];
print_r($result);
//...
For more information see the Amazons's use case documentation about this topic: https://github.com/amzn/selling-partner-api-docs/blob/main/guides/en-US/use-case-guides/tokens-api-use-case-guide/tokens-API-use-case-guide-2021-03-01.md