Construire un lien d'affiliation personnalisé avec l'API Amazon Product Merchandising
() translation by (you can also view the original English article)
Le programme Amazon Associates, associé à Amazon Web Services (AWS), offre aux développeurs un moyen puissant de rechercher dans le catalogue de l'Amazon Store à l'aide d'une API RESTful et d'intégrer les données de pratiquement toutes les listes de produits dans une page Web. Si vous êtes un programmeur ayant un esprit d'entreprise et cherchant des moyens de monétiser votre site, vous pouvez vous inscrire en tant qu'affilié d'Amazon et gagner une commission chaque fois qu'un utilisateur clique sur votre lien de produit et complète un achat. (Et en ce qui concerne les programmes d'affiliation, les commissions d'Amazon sont parmi les plus généreuses.)
Pour ceux d'entre vous qui débutent dans le marketing d'affiliation, supposons que vous dirigez un blog ou un site Web proposant des critiques de films. Pour chaque critique de film publiée, vous pouvez bénéficier d'un lien permettant aux lecteurs d'acheter le film quelque part près de votre article. Pour rendre le clic plus attrayant, le lien peut inclure une vignette du DVD, le nom complet du film, le prix le plus bas disponible et un bouton "Acheter".
Dans ce tutoriel, je vais vous montrer comment créer une classe PHP dédiée et réutilisable qui se connecte à l'API Product Merchandising et récupère les données XML en fonction du nom du produit et de la catégorie d'achat (dans ce cas, "Films"). À la fin, nous peuplerons ces données dans un petit modèle HTML entièrement personnalisable afin de nous retrouver avec une démonstration de travail d'un mini module d'affilié. Commençons.
[Veuillez noter, avant d'accéder à l'exemple de démonstration, que si vous choisissez d'acheter ou de louer le DVD à partir du lien fourni, cela entraînera un paiement de commission à Envato Tuts +.]
Enregistrement d'un identifiant d'affilié et obtention des informations d'identification
Commencez par créer un compte sur affiliate-program.amazon.com. C'est gratuit et il vous suffit de suivre les étapes pour créer un profil pour votre site Web. Vous serez invité à vérifier votre identité à la fin du processus en entrant votre numéro de téléphone, en recevant un appel automatisé et en saisissant le code d'accès que vous avez reçu.
Une fois l'enregistrement terminé, vous recevrez un ID d'affilié Amazon (dans cet exemple, il s'agit de "envtuts-20"). Connectez-vous à la zone de votre compte principal avec votre nom d'utilisateur et votre mot de passe et cliquez sur l'onglet API Merchandising du produit. Là, cliquez sur le lien pour commencer à utiliser l’API.
Si vous ne l'avez pas déjà fait, vous devrez vous inscrire à Amazon Web Services (aws.amazon.com). Dans la console AWS, sous Informations d'identification de sécurité, vous pouvez générer une clé d'accès et une clé secrète pour effectuer des demandes d'API. (Remarque: il est important de garder ces informations d'identification privées et sécurisées. Ne les exposez jamais publiquement sur GitHub ou ailleurs en ligne.)
Configurer notre classe PHP Helper
Pour les besoins de cet exemple et pour que les choses restent relativement simples, nous allons implémenter le modèle de conception Singleton pour créer une classe d'assistance statique appelée AmazonAssocHelper
. Il inclura une méthode publique qui se connecte à l'API, effectue une recherche dans le catalogue et renvoie les données du produit à l'aide de certains paramètres que nous transmettons. Voici comment je l'ai mis en place:
1 |
<?php
|
2 |
|
3 |
|
4 |
namespace App\Services; |
5 |
|
6 |
use App\lib\vendor\aws\AWSSignedRequest; |
7 |
|
8 |
|
9 |
class AmazonAssocHelper { |
10 |
|
11 |
//AMAZON AFFILIATE PROGRAM ACCESS -- sign into affiliate-program.amazon.com
|
12 |
const AMZ_ASSOC_TAG = 'your-affiliate-id'; |
13 |
|
14 |
//AWS credentials -- sign into aws.amazon.com
|
15 |
const AMZ_ASSOC_ACCESSKEY = 'YOUR_ACCESS_KEY'; |
16 |
const AMZ_ASSOC_SECRETKEY = 'YOUR_SECRET_KEY'; |
17 |
|
18 |
//Set the values for some of the search parameters
|
19 |
private static $operation = "ItemSearch"; |
20 |
private static $version = "2013-08-01"; |
21 |
private static $response_group = "Small,Images,OfferSummary"; |
22 |
|
23 |
protected function __construct() { |
24 |
|
25 |
}
|
26 |
|
27 |
/**
|
28 |
* Fetches relevant product data in product API from keyphrase and category
|
29 |
* returns: array of data from the top result node
|
30 |
*/
|
31 |
public static function fetch_product_data($keyphrase, $category) { |
32 |
|
33 |
$result_xml = self::get_search_results($keyphrase, $category); |
34 |
|
35 |
//return an array containing the item name, link, image, and price
|
36 |
return self::get_top_result_data($result_xml); |
37 |
|
38 |
}
|
39 |
|
40 |
|
41 |
}
|
Les deux premières lignes déclarent un espace de noms pour notre classe et incluent une classe tierce dont nous aurons besoin pour faire une demande signée à l'API avec nos informations d'identification. Les trois constantes que j'ai définies sont notre identifiant d'affilié, que nous avons obtenu après notre inscription, ainsi que la clé d'accès et la clé secrète AWS. Lorsque nous faisons nos demandes d'API, l'ID d'affilié est automatiquement inséré dans le lien de produit que nous récupérons afin que les achats puissent être correctement retracés sur notre compte et que nous soyons payés! Assurez-vous de remplir ces trois valeurs pour vous-même.
Les trois variables privées font référence aux paramètres de recherche que nous fournirons pour chaque demande. J'utilise "ItemSearch" comme choix d'opération pour rechercher des résultats. "2013-08-01" correspond à la date de la dernière version de l'API, que nous devons également fournir à notre demande signée. Enfin, nous devons désigner les groupes de réponses à renvoyer. Il existe 55 choix en tout et ils varient en taille et en type de données. Pour nos besoins, nous recherchons le titre complet du film et l'URL complète de la page de détail, les deux faisant partie du groupe de réponses "Petit". Nous avons également besoin d'une vignette du groupe de réponses "Images" et du nouveau prix le plus bas du groupe "OfferSummary".
La fonction fetch_product_data()
est notre méthode exposée publiquement qui prend deux paramètres:
- une phrase-clé spécifique faisant référence au nom du produit que nous souhaitons rechercher
- une catégorie de produits Amazon acceptée
Il renverra finalement un tableau de données relatives au résultat de recherche supérieur analysé à partir d'une réponse XML. (Dans de nombreux cas, le premier résultat sera le produit souhaité, en supposant que la phrase clé fournie soit suffisamment spécifique. Vous pouvez également décider de modifier cet exemple afin de rechercher le numéro ASIN ou ID spécifique du produit. au lieu de cela, mais il y a des avantages et des inconvénients à cette méthode. Si vous avez une base de données volumineuse de pages d'articles pour différents films, l'utilisation d'une approche basée sur les noms s'avérera probablement plus efficace, car elle vous permettra de générer automatiquement des liens de produits pour tous vos articles instantanément, tout en vous faisant gagner du temps supplémentaire. effort de devoir rechercher manuellement et insérer des identifiants pour chacun.)
Générer une demande signée
L'étape suivante consiste à ajouter une classe d'assistance qui effectuera la demande signée à l'API du produit. J'ai utilisé une fonction tierce écrite par Ulrich Mierendorff et l'ai enveloppée dans sa propre classe statique appelée AWSSignedRequest
. Il faut plusieurs paramètres, y compris la région (pour le magasin américain, nous utilisons "com"), un tableau de paramètres de requête, nos clés AWS, nos groupes de réponses et la version de l'API que nous avons déjà définie. La méthode get_signed_request()
génère et renvoie essentiellement une chaîne de demande d'URL complète à partir de toutes ces pièces.
L'URL de la demande signée finale ressemblera à ceci:
1 |
http://webservices.amazon.com/onca/xml? |
2 |
AWSAccessKeyId=AKIAJILHUTAJ5MMQRJWA |
3 |
&AssociateTag=envtut-20 |
4 |
&Operation=ItemSearch |
5 |
&ResponseGroup=Small%2CImages%2COfferSummary |
6 |
&SearchIndex=Movies |
7 |
&Service=AWSECommerceService |
8 |
&Timestamp=2015-11-06T20%3A34%3A52Z |
9 |
&Title=Jurassic%20World |
10 |
&Version=2013-08-01 |
11 |
&Signature=nwkfvvLCvl11Cunuthz6orXCbBMnBc1Z7S3HSfYW%2B14%3D |
Dans la classe AmazonAssocHelper
, placez l'appel à get_signed_request ()
dans une méthode appelée get_search_results (
) et transmettez un tableau contenant quatre paramètres de recherche ($params
) ainsi que les autres arguments, comme indiqué ci-dessous:
1 |
/**
|
2 |
* Runs search with signed request on product API using keyphrase and category name
|
3 |
* returns: XML object
|
4 |
*/
|
5 |
private static function get_search_results($keyphrase, $search_index) { |
6 |
|
7 |
//Define the request
|
8 |
$params = array("SearchIndex"=>$search_index, //the category |
9 |
"Title"=>$keyphrase, |
10 |
"Operation"=>self::$operation, |
11 |
"ResponseGroup"=>self::$response_group); |
12 |
|
13 |
$request = AWSSignedRequest::get_signed_request('com', $params, self::AMZ_ASSOC_ACCESSKEY, self::AMZ_ASSOC_SECRETKEY, self::AMZ_ASSOC_TAG, self::$version); |
14 |
|
15 |
$response = file_get_contents($request); |
16 |
|
17 |
//for testing
|
18 |
/*header('Content-type: application/xml');
|
19 |
echo $response;
|
20 |
exit;*/
|
21 |
|
22 |
return simplexml_load_string($response); |
23 |
|
24 |
}
|
Notre tableau $params
inclut l'opération et la réponse que nous avons déjà définies, ainsi que les valeurs de 'Title' et 'SearchIndex'. Dans ce cas, SearchIndex est simplement la catégorie de produit sur laquelle nous effectuons une recherche. Maintenant, nous pouvons appeler la fonction intégrée file_get_contents()
de PHP pour générer une réponse à partir de la requête, et comme la réponse est un document XML, nous utilisons une autre fonction intégrée, simplexml_load_string()
, peut analyser.
Test de la réponse et prévisualisation des données XML
À ce stade, nous souhaitons pouvoir tester notre requête d'API avec des valeurs de produit réelles afin de voir un exemple réel de ce à quoi nos données XML renvoyées ressemblent avant de les analyser. Comme indiqué ci-dessus, ajoutez quelques lignes de test pour définir l'en-tête sur application / XML et imprimez la réponse $response
avant qu'elle ne soit renvoyée.
Maintenant, créez un fichier qui servira de page principale sur laquelle le lien du produit sera affiché. J'ai décidé de l'appeler index.php. En haut, ajoutez le bit de code suivant:
1 |
<?php
|
2 |
|
3 |
namespace App\Services; |
4 |
|
5 |
require_once getcwd() . '/App/app_global.php'; |
6 |
|
7 |
/**
|
8 |
* Call the Product API by passing in the name of the product and the shopping category
|
9 |
* ("Books", "Movies", and "VideoGames" are examples -- see API documentation for full list)
|
10 |
*/
|
11 |
$product_data = AmazonAssocHelper::fetch_product_data("Jurassic World", "Movies"); |
12 |
|
13 |
|
14 |
?>
|
Les deux premières lignes déclarent notre espace de noms et incluent une fonction globale qui permet le chargement automatique de nos fichiers de classe, car nous n'utilisons pas de framework PHP. La ligne suivante est la plus importante. Nous appelons la méthode publique fetch_product_data ()
sur notre classe AmazonAssocHelper
et l'attribuons à une variable de tableau appelée $product_data
, en transmettant un nom de film spécifique en tant que phrase clé (j'ai choisi "Jurassic World" dans la liste actuelle des meilleures ventes) et "Films" en tant que catégorie.
Lorsque vous chargez votre page, le début de votre réponse XML devrait ressembler à ceci:
1 |
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2013-08-01"> |
2 |
<OperationRequest>
|
3 |
<RequestId>807ede04-f196-44a0-99ff-ff1bb1c12fee</RequestId> |
4 |
<Arguments>
|
5 |
<Argument Name="AWSAccessKeyId" Value="AWS_ACCESS_KEY"/> |
6 |
<Argument Name="AssociateTag" Value="envtut-20"/> |
7 |
<Argument Name="Operation" Value="ItemSearch"/> |
8 |
<Argument Name="ResponseGroup" Value="Small,Images,OfferSummary"/> |
9 |
<Argument Name="SearchIndex" Value="Movies"/> |
10 |
<Argument Name="Service" Value="AWSECommerceService"/> |
11 |
<Argument Name="Timestamp" Value="2015-11-03T21:32:57Z"/> |
12 |
<Argument Name="Title" Value="Jurassic World"/> |
13 |
<Argument Name="Version" Value="2013-08-01"/> |
14 |
<Argument Name="Signature" Value="QhUpga/f2MReU4xpdzCr432hMvxeA72N+v+G0hVi17M="/> |
15 |
</Arguments>
|
16 |
<RequestProcessingTime>0.0887890000000000</RequestProcessingTime> |
17 |
</OperationRequest>
|
18 |
<Items>
|
19 |
<Request>...</Request> |
20 |
<TotalResults>37</TotalResults> |
21 |
<TotalPages>4</TotalPages> |
22 |
<MoreSearchResultsUrl>...</MoreSearchResultsUrl> |
23 |
<Item>
|
24 |
<ASIN>B016W01EXI</ASIN> |
25 |
<DetailPageURL>
|
26 |
http://www.amazon.com/Jurassic-World-Chris-Pratt/dp/B016W01EXI%3FSubscriptionId%3DAKIAJILHUTAJ5MMQRJWA%26tag%3Denvtut-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB016W01EXI |
27 |
</DetailPageURL>
|
28 |
<ItemLinks>
|
29 |
<ItemLink>
|
30 |
<Description>Technical Details</Description> |
31 |
<URL>
|
32 |
http://www.amazon.com/Jurassic-World-Chris-Pratt/dp/tech-data/B016W01EXI%3FSubscriptionId%3DAKIAJILHUTAJ5MMQRJWA%26tag%3Denvtut-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D386001%26creativeASIN%3DB016W01EXI |
33 |
</URL>
|
34 |
</ItemLink>
|
Si vous faites défiler et numérisez la sortie, vous devriez pouvoir voir toutes les données utiles à notre démonstration, y compris <DetailPageURL>
,<Title>
,<LargeImage>
et <LowestNewPrice>
.,<LargeImage> et <LowestNewPrice>. Il y a les nœuds sur lesquels nous allons nous concentrer., <LargeImage> et <LowestNewPrice>. Il y a les nœuds sur lesquels nous allons nous concentrer.
Analyser l'objet de réponse
Dans la classe AmazonAssocHelper
, créez une autre méthode appelée get_top_result_data()
qui prend notre objet de réponse XML comme paramètre. Nous pouvons maintenant commencer à lire les noeuds contenant les données que nous voulons capturer, mais avant d’y aller, prévoyons d’incorporer une vérification des erreurs. J'ai ajouté quelques lignes en haut de notre fonction pour invoquer une méthode qui se chargera de l'analyse des nœuds d'erreur pour nous, et je vais l'expliquer plus en détail vers la fin de ce didacticiel.
1 |
/**
|
2 |
* Parses top result node, and its attributes, from XML object
|
3 |
* returns: array of product data
|
4 |
*/
|
5 |
private static function get_top_result_data($xml) { |
6 |
|
7 |
if (!empty(self::handle_errors($xml))) { |
8 |
return array('error'=>self::handle_errors($xml)); |
9 |
}
|
10 |
|
11 |
//get the first result node
|
12 |
$first_item = $xml->Items[0]->Item; |
13 |
$item_title = $first_item->ItemAttributes->Title; |
14 |
$item_link = $first_item->DetailPageURL; |
15 |
$item_image = $first_item->LargeImage->URL; |
16 |
$item_price = $first_item->OfferSummary->LowestNewPrice->FormattedPrice; |
17 |
|
18 |
return array( 'title'=>(string)$item_title, |
19 |
'link'=>(string)$item_link, |
20 |
'image'=>(string)$item_image, |
21 |
'price'=>(string)$item_price ); |
22 |
|
23 |
|
24 |
|
25 |
}
|
Comme vous pouvez le constater dans le code ci-dessus, nous commençons par récupérer le premier nœud d'élément (Item[0]
) à partir de l'objet XML et de le stocker dans une variable ($first_item
). Ensuite, nous opérons sur chacun de ses enfants pour collecter les informations souhaitées ($item_title
, $item_link
, $item_image
, $item_price
). Finalement, nous emballons le tout dans un tableau avec des attributs nommés et retournons le tableau.
Gestion des erreurs
Créez une méthode appelée handle_errors()
et transmettez le même objet XML. Selon la configuration de cette API, plusieurs nœuds d'erreur dotés de codes et de messages spécifiques sont configurés pour apparaître dans le nœud <OperationRequest>
ou le nœud <Request>
Items . Vous pouvez les tester en définissant un index de recherche ou un groupe de réponses non valide. Le code suivant parcourt chacun des nœuds et pousse les messages d'erreur dans un tableau que nous renvoyons:
1 |
/**
|
2 |
* Checks for errors in the request/ result
|
3 |
* returns: array with message(s) describing the "error"
|
4 |
*/
|
5 |
private static function handle_errors($xml) { |
6 |
|
7 |
$errors_arr = array(); |
8 |
|
9 |
//process errors in request
|
10 |
foreach ($xml->OperationRequest->Errors->Error as $error) { |
11 |
|
12 |
error_log("Error code: " . $error->Code . "\r\n"); |
13 |
error_log($error->Message . "\r\n"); |
14 |
error_log("\r\n"); |
15 |
|
16 |
array_push($errors_arr, (string)$error->Message); |
17 |
}
|
18 |
|
19 |
//check for invalid category, no matches, or other search error
|
20 |
foreach ($xml->Items->Request->Errors->Error as $error) { |
21 |
|
22 |
error_log("Error code: " . $error->Code . "\r\n"); |
23 |
error_log($error->Message . "\r\n"); |
24 |
error_log("\r\n"); |
25 |
|
26 |
array_push($errors_arr, (string)$error->Message); |
27 |
}
|
28 |
|
29 |
|
30 |
return $errors_arr; |
31 |
|
32 |
}
|
Remplir les données dans un modèle HTML
À ce stade, vous pouvez supprimer les appels de test XML, car nous sommes prêts à examiner la sortie finale des données. Dans index.php, imprimez le $product_data array
renvoyé et chargez la page. Vous devriez voir quelque chose comme ça:
1 |
Array ( [title] => Jurassic World [link] => http://www.amazon.com/Jurassic-World-Chris-Pratt/dp/B016W01EXI%3FSubscriptionId%3DAKIAJILHUTAJ5MMQRJWA%26tag%3Denvtut-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB016W01EXI [image] => http://ecx.images-amazon.com/images/I/51ePeFXU2ML.jpg [price] => $5.99 ) |
Une fois que vous avez vérifié que les données semblent correctes pour chacune des quatre propriétés qui nous intéressent, vous pouvez essayer d'exécuter l'appel sur d'autres films ou produits à des fins de comparaison. Notez que l'identifiant de l'affilié (dans ce cas "envtut-20") a été automatiquement inséré dans le "lien" comme on pouvait s'y attendre.
Enfin, codons un simple bloc HTML pour afficher les données de notre film et le lier à la page d’achat. Dans index.php, ajoutez ce qui suit sous le bloc PHP:
1 |
<!doctype html>
|
2 |
<html>
|
3 |
<head>
|
4 |
<title>Tuts+ Demo: Amazon Product API</title> |
5 |
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> |
6 |
<link rel="stylesheet" href="css/reset.css" /> |
7 |
<link rel="stylesheet" href="css/style.css" /> |
8 |
</head>
|
9 |
<body>
|
10 |
<?php if (!empty($product_data) && array_key_exists("error", $product_data) != 1): ?>
|
11 |
<div class="affiliate_wrap"> |
12 |
|
13 |
<a href="<?php echo $product_data['link']; ?>" target="_blank"> |
14 |
<img src="<?php echo $product_data['image']; ?>" alt="<?php echo $product_data['title']; ?>" /> |
15 |
</a>
|
16 |
<h2>
|
17 |
<a href="<?php echo $product_data['link']; ?>" target="_blank"><?php echo $product_data['title']; ?></a> |
18 |
</h2>
|
19 |
<p><em><?php echo $product_data['price']; ?></em> on Amazon</p> |
20 |
<a class="button" href="<?php echo $product_data['link']; ?>" target="_blank">Buy Now</a> |
21 |
</div>
|
22 |
|
23 |
<?php endif ?>
|
24 |
</body>
|
25 |
</html>
|
Notez que si une erreur est renvoyée, j'ai choisi de masquer complètement l'affichage, mais vous pouvez également afficher le message d'erreur approprié à la place.
Maintenant, avec les styles CSS ajoutés, la sortie finale ressemblerait à ceci:

Et voila! Une fois que vous avez lancé votre module d’affiliation dans le monde, vous pouvez suivre tous les achats et revenus en vous connectant à votre compte.
Conclusion
Dans ce didacticiel, nous avons présenté toutes les étapes nécessaires à un programmeur PHP pour créer une solution de code évolutive générant instantanément un lien d'affiliation personnalisé pour pratiquement tous les produits d'Amazon Store. En fonction de vos besoins ou de vos préférences, vous pouvez décider de modifier ou d’étendre cet exemple avec différents paramètres.
Vous pouvez également explorer vous-même la documentation de l'API plus en détail pour découvrir encore plus de ce qui est possible. L’utilisation réelle de l’API de marchandisage réside dans la flexibilité qu’elle offre pour organiser et afficher une gamme complète d’informations en temps réel sur un produit ou une liste de produits. Avec le générateur de liens par défaut d'Amazon (aucune connaissance en matière de codage requise), vous n'obtenez pas le même contrôle et les options sont limitées.
L’API brille vraiment sur les pages Web générées de manière dynamique et sur les pages où vous avez besoin d’un contrôle plus strict de l’apparence de vos liens. Par conséquent, si vous travaillez sur un site Web ou un blog dans ce sens et que vous souhaitez intégrer la monétisation, j’espère que vous avez trouvé ce tutoriel utile.