header Alex
« Inapoi la treaba
Ikea »

Codul PHP pentru a semna cererile la Amazon API

Amazon AssociatesScriam inainte de a intra in concediu ca Amazon va introduce incepand cu 15 august autentificarea pentru folosirea API-ului lor. Drept urmare m-am trezit pe siteul meu de versuri cu o problema …

The request must contain the parameter Signature.

Am cautat si in forumul lor, am si googalit … si-am dat de solutia lui Brandon Checketts (THANK YOU, Brandon! winking ).

function signAmazonUrl($url)
{
global $CONFIG;
$original_url = $url;
// Decode anything already encoded
$url = urldecode($url);
// Parse the URL into $urlparts
$urlparts       = parse_url($url);
// Build $params with each name/value pair
foreach (split('&', $urlparts['query']) as $part) {
if (strpos($part, '=')) {
list($name, $value) = split('=', $part, 2);
} else {
$name = $part;
$value = '';
}
$params[$name] = $value;
}
// Include a timestamp if none was provided
if (empty($params['Timestamp'])) {
$params['Timestamp'] = gmdate('Y-m-d\TH:iconfused\Z');
}
// Sort the array by key
ksort($params);
// Build the canonical query string
$canonical = '';
foreach ($params as $key => $val) {
$canonical  .= "$key=".rawurlencode($val)."&";
}
// Remove the trailing ampersand
$canonical = preg_replace("/&$/", '', $canonical);
// Some common replacements and ones that Amazon specifically mentions
$canonical = str_replace(array(' ', '+', ',', ';'), array('%20', '%20', urlencode(','), urlencode(':')), $canonical);
// Build the si
$string_to_sign = "GET\n{$urlparts['host']}\n{$urlparts['path']}\n$canonical";
// Calculate our actual signature and base64 encode it
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $CONFIG['AMAZON_SECRET_KEY'], true));
// Finally re-build the URL with the proper string and include the Signature
$url = "{$urlparts['scheme']}://{$urlparts['host']}{$urlparts['path']}?$canonical&Signature=".rawurlencode($signature);
return $url;
}

Tot ce trebuie facut acum este sa setati o variabila globala $CONFIG[‘AMAZON_SECRET_KEY’] si apoi sa chemati functia signAmazonUrl() in orice loc aveati un URL de la Amazon API; ca in exemplul meu:

$rss_parser_nuebun = "http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=<AWSAccessKeyId>&Version=2008-04-07&AssociateTag=<tagul-tau>&Operation=ItemSearch&SearchIndex=Music&Title=<cuvinte-pentru-cautare>&ResponseGroup=Images,ItemAttributes,OfferSummary";
$rss_parser = signAmazonUrl($rss_parser_nuebun);

Si iata-l si in actiune (in partea stanga pe fundal albastru, unde sunt plasate 3 produse de la Amazon).

PS: Nu stii ce e Amazon? Vezi aici.

Etichete: ,
joi, 27 august 2009, 0:50

Articole prin email


* Si eu urasc spamul ca si tine. Adresa ta de email va fi folosita DOAR pentru a primi posturile publicate pe blog.

Recomand si sustin

DropBox

Multilingual WordPress

Bookmark