Wednesday, May 30, 2012

Fix For Amazon API Error: Your request is missing required parameters. Required parameters include AssociateTag.

Amazon has made changes to there API which came effect since November 1st: 2011, and you might be getting following error when you made request to Product Advertising API.

Your request is missing required parameters. Required parameters include AssociateTag.



The fix is below

Sign up for Amazon Associates account.

get AssociateTag and pass it as parm in the request

eg:
[php]
$method = "GET";
$host = "ecs.amazonaws.".$region; // must be in small case
$uri = "/onca/xml";

$params["Service"] = "AWSECommerceService";
$params["AWSAccessKeyId"] = $public_key;
<strong>$params["AssociateTag"] = "your associate tag here ";</strong>
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
$params["Version"] = "2009-03-31";

/* The params need to be sorted by the key, as Amazon does this at
their end and then generates the hash of the same. If the params
are not in order then the generated hash will be different thus
failing the authetication process.
*/
ksort($params);

$canonicalized_query = array();

foreach ($params as $param=&amp;gt;$value)
{
$param = str_replace("%7E", "~", rawurlencode($param));
$value = str_replace("%7E", "~", rawurlencode($value));
$canonicalized_query[] = $param."=".$value;
}

$canonicalized_query = implode("&amp;amp;", $canonicalized_query);

$string_to_sign = $method."\n".$host."\n".$uri."\n".$canonicalized_query;

/* calculate the signature using HMAC with SHA256 and base64-encoding.
The 'hash_hmac' function is only available from PHP 5 &amp;gt;= 5.1.2.
*/
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, True));

/* encode the signature for the request */
$signature = str_replace("%7E", "~", rawurlencode($signature));

/* create request */
$request = "http://".$host.$uri."?".$canonicalized_query."&amp;amp;Signature=".$signature;

/* I prefer using CURL */
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$request);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

$xml_response = curl_exec($ch);
[/php]

No comments:

Post a Comment