I am exploring the Amazon Product advertisement API(PA 5). I am using the GetItems
method. The API does not return ratings and reviews count. I have used amazon's scratchpad platform as well as PHP code for doing the same but no luck. I only got generic responses from Amazon's customer support as they say that one has to refer to online forums regarding this and they cannot provide a solution/explanation as to why the following data is not being returned.
Here is the JSON response I am getting with scratchpad.
{"ItemIds": ["B085WLFSJ1" ],"Resources": ["CustomerReviews.Count" ],"PartnerType": "Associates","Marketplace": "www.amazon.com","Operation": "GetItems"}
Here is the PHP code I am using
<?php$serviceName="ProductAdvertisingAPI";$region="us-east-1";$accessKey="myaccesskey";$secretKey="mysecretkey";$payload="{" ." \"ItemIds\": [" ." \"B083JKTMYQ\"" ." ]," ." \"Resources\": [" ." \"CustomerReviews.Count\"," ." \"CustomerReviews.StarRating\"," ." \"Images.Primary.Small\"," ." \"Images.Primary.Medium\"," ." \"Images.Primary.Large\"," ." \"Images.Variants.Small\"," ." \"Images.Variants.Medium\"," ." \"Images.Variants.Large\"" ." ]," ." \"PartnerTag\": \"sleephall08-20\"," ." \"PartnerType\": \"Associates\"," ." \"Marketplace\": \"www.amazon.com\"" ."}";$host="webservices.amazon.com";$uriPath="/paapi5/getitems";$awsv4 = new AwsV4 ($accessKey, $secretKey);$awsv4->setRegionName($region);$awsv4->setServiceName($serviceName);$awsv4->setPath ($uriPath);$awsv4->setPayload ($payload);$awsv4->setRequestMethod ("POST");$awsv4->addHeader ('content-encoding', 'amz-1.0');$awsv4->addHeader ('content-type', 'application/json; charset=utf-8');$awsv4->addHeader ('host', $host);$awsv4->addHeader ('x-amz-target', 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.GetItems');$headers = $awsv4->getHeaders ();$headerString = "";foreach ( $headers as $key => $value ) { $headerString .= $key . ': ' . $value . "\r\n";}$params = array ('http' => array ('header' => $headerString,'method' => 'POST','content' => $payload ) );$stream = stream_context_create ( $params );$fp = @fopen ( 'https://'.$host.$uriPath, 'rb', false, $stream );if (! $fp) { throw new Exception ( "Exception Occured" );}$response = @stream_get_contents ( $fp );if ($response === false) { throw new Exception ( "Exception Occured" );}echo $response;class AwsV4 { private $accessKey = null; private $secretKey = null; private $path = null; private $regionName = null; private $serviceName = null; private $httpMethodName = null; private $queryParametes = array (); private $awsHeaders = array (); private $payload = ""; private $HMACAlgorithm = "AWS4-HMAC-SHA256"; private $aws4Request = "aws4_request"; private $strSignedHeader = null; private $xAmzDate = null; private $currentDate = null; public function __construct($accessKey, $secretKey) { $this->accessKey = $accessKey; $this->secretKey = $secretKey; $this->xAmzDate = $this->getTimeStamp (); $this->currentDate = $this->getDate (); } function setPath($path) { $this->path = $path; } function setServiceName($serviceName) { $this->serviceName = $serviceName; } function setRegionName($regionName) { $this->regionName = $regionName; } function setPayload($payload) { $this->payload = $payload; } function setRequestMethod($method) { $this->httpMethodName = $method; } function addHeader($headerName, $headerValue) { $this->awsHeaders [$headerName] = $headerValue; } private function prepareCanonicalRequest() { $canonicalURL = ""; $canonicalURL .= $this->httpMethodName . "\n"; $canonicalURL .= $this->path . "\n" . "\n"; $signedHeaders = ''; foreach ( $this->awsHeaders as $key => $value ) { $signedHeaders .= $key . ";"; $canonicalURL .= $key . ":" . $value . "\n"; } $canonicalURL .= "\n"; $this->strSignedHeader = substr ( $signedHeaders, 0, - 1 ); $canonicalURL .= $this->strSignedHeader . "\n"; $canonicalURL .= $this->generateHex ( $this->payload ); return $canonicalURL; } private function prepareStringToSign($canonicalURL) { $stringToSign = ''; $stringToSign .= $this->HMACAlgorithm . "\n"; $stringToSign .= $this->xAmzDate . "\n"; $stringToSign .= $this->currentDate . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "\n"; $stringToSign .= $this->generateHex ( $canonicalURL ); return $stringToSign; } private function calculateSignature($stringToSign) { $signatureKey = $this->getSignatureKey ( $this->secretKey, $this->currentDate, $this->regionName, $this->serviceName ); $signature = hash_hmac ( "sha256", $stringToSign, $signatureKey, true ); $strHexSignature = strtolower ( bin2hex ( $signature ) ); return $strHexSignature; } public function getHeaders() { $this->awsHeaders ['x-amz-date'] = $this->xAmzDate; ksort ( $this->awsHeaders ); // Step 1: CREATE A CANONICAL REQUEST $canonicalURL = $this->prepareCanonicalRequest (); // Step 2: CREATE THE STRING TO SIGN $stringToSign = $this->prepareStringToSign ( $canonicalURL ); // Step 3: CALCULATE THE SIGNATURE $signature = $this->calculateSignature ( $stringToSign ); // Step 4: CALCULATE AUTHORIZATION HEADER if ($signature) { $this->awsHeaders ['Authorization'] = $this->buildAuthorizationString ( $signature ); return $this->awsHeaders; } } private function buildAuthorizationString($strSignature) { return $this->HMACAlgorithm . " " . "Credential=" . $this->accessKey . "/" . $this->getDate () . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "," . "SignedHeaders=" . $this->strSignedHeader . "," . "Signature=" . $strSignature; } private function generateHex($data) { return strtolower ( bin2hex ( hash ( "sha256", $data, true ) ) ); } private function getSignatureKey($key, $date, $regionName, $serviceName) { $kSecret = "AWS4" . $key; $kDate = hash_hmac ( "sha256", $date, $kSecret, true ); $kRegion = hash_hmac ( "sha256", $regionName, $kDate, true ); $kService = hash_hmac ( "sha256", $serviceName, $kRegion, true ); $kSigning = hash_hmac ( "sha256", $this->aws4Request, $kService, true ); return $kSigning; } private function getTimeStamp() { return gmdate ( "Ymd\THis\Z" ); } private function getDate() { return gmdate ( "Ymd" ); }}?><?php$curl = curl_init();curl_setopt_array($curl, [ CURLOPT_URL => "https://get.scrapehero.com/amz/product-reviews/?x-api-key=q9LJPUmr7e/TtEi/noQ0NeJ9kO/JGMEGctsDH/oK&asin=B07NFTVP7P&country_code=US&page=1&sort=top", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "GET",]);$response = curl_exec($curl);$err = curl_error($curl);curl_close($curl);if ($err) { echo "cURL Error #:" . $err;} else { echo $response;}?>
Any help regarding this would be great.