Bouw een aangepaste gelieerde koppeling met de Amazon Merchandising API voor producten

Het Amazon Associates-programma biedt, in samenwerking met Amazon Web Services (AWS), ontwikkelaars een krachtig middel om de Amazon Store-catalogus te doorzoeken met behulp van een RESTful API en gegevens voor vrijwel elke productvermelding te integreren in een webpagina. Als u een programmeur bent met een zakelijke instelling en op zoek bent naar manieren om inkomsten te genereren met uw site, kunt u zich aanmelden als een Amazon-partner en een commissie verdienen telkens wanneer een gebruiker op uw productkoppeling klikt en een aankoop voltooit. (En wat betreft affiliate-inkomstenprogramma's, Amazon's commissies behoren tot de meest genereuze.)

Voor degenen onder u die nieuw zijn bij het idee van affiliate marketing, stel dat u een blog of website met filmrecensies draait. Voor elke recensie die is gepost, kunt u profiteren van een link voor lezers om de film ergens in de buurt van uw artikel te kopen. Om het aantrekkelijker te maken om te klikken, kan de link een miniatuurafbeelding van de dvd bevatten, de volledige filmnaam, de laagste beschikbare prijs en een knop 'Kopen'..

In deze zelfstudie laat ik je zien hoe je een speciale, herbruikbare klasse in PHP maakt die verbinding maakt met de Product Merchandising API en XML-gegevens ophaalt op basis van de naam van het product en de winkelcategorie (in dit geval "Films"). Aan het einde vullen we die gegevens in een kleine, volledig aanpasbare HTML-sjabloon, zodat we eindigen met een werkende demo van een mini-partnermodule. Laten we beginnen.

[Let op voordat u de voorbeelddemo opent: als u ervoor kiest om de dvd te kopen of te huren via de aangeboden link, resulteert dit in een commissiebetaling aan Envato Tuts +.]

Registreren voor een gelieerde ID en inloggegevens verkrijgen

Meld u eerst aan voor een account op affiliate-program.amazon.com. Het is gratis en u hoeft alleen maar de stappen te volgen om een ​​profiel voor uw website te maken. Aan het einde van het proces wordt u gevraagd uw identiteit te verifiëren door uw telefoonnummer in te voeren, een automatisch gesprek te ontvangen en de toegangscode in te voeren die u hebt gekregen.

Nadat u de registratie hebt voltooid, ontvangt u een Amazon Affiliate ID (in dit voorbeeld is dit "envtuts-20"). Log in op uw hoofdaccountgebied met uw gebruikersnaam en wachtwoord en klik op de Product Merchandising API tab. Klik daar op de link om aan de slag te gaan met de API. 

U moet zich aanmelden voor Amazon Web Services (aws.amazon.com), als u dat nog niet hebt gedaan. In de AWS-console, onder Beveiligingslegitimatie, u kunt een toegangssleutel en een geheime sleutel genereren voor het maken van API-verzoeken. (Opmerking: het is belangrijk om deze inloggegevens privé en veilig te houden. Stel ze nooit openbaar openbaar op GitHub of ergens anders online.)

Opzetten van onze PHP Helper Class

Voor de doeleinden van dit voorbeeld en om de zaken relatief eenvoudig te houden, zullen we het Singleton-ontwerppatroon implementeren om een ​​statische helperklasse te creëren AmazonAssocHelperHet bevat een openbare methode die verbinding maakt met de API, de catalogus doorzoekt en productgegevens retourneert met behulp van bepaalde parameters die we doorgeven. Dit is hoe ik het heb opgezet:

De eerste paar regels verklaren een naamruimte voor onze klasse en bevatten een externe klasse die we nodig hebben om een ​​ondertekend verzoek naar de API te maken met onze referenties. De drie constanten die ik heb gedefinieerd, zijn onze allerbelangrijkste partner-ID, die we na aanmelding hebben verkregen, en de AWS-toegangssleutel en geheime sleutel. Wanneer we onze API-verzoeken indienen, wordt de partner-id automatisch ingevoegd in de productlink die we ophalen, zodat aankopen op passende wijze kunnen worden getraceerd naar onze account en we worden betaald! Zorg ervoor dat u alle drie deze waarden zelf invult.

De drie privévariabelen verwijzen naar zoekparameters die we voor elke aanvraag zullen leveren. Ik gebruik "ItemSearch" als onze operationele keuze om resultaten op te zoeken. "2013-08-01" is de datum van de laatste API-versie, die we ook moeten leveren aan ons ondertekende verzoek, en ten slotte moeten we aangeven welke antwoordgroepen we graag teruggestuurd willen hebben. Er zijn in totaal 55 keuzes en deze variëren in grootte en soort geretourneerde gegevens. Voor onze doeleinden zijn we op zoek naar de volledige titel van de film en de volledige URL voor de detailpagina, beide in de responsiegroep 'Klein'. We hebben ook een miniatuurafbeelding nodig uit de antwoordgroep "Afbeeldingen" en de laagste nieuwe prijs uit de groep "OfferSummary".

De fetch_product_data () functie is onze openbaar zichtbare methode die twee parameters vereist:

  1. een specifieke sleutelzin die verwijst naar de naam van het product waarnaar we willen zoeken
  2. een geaccepteerde Amazon-productcategorie

Het retourneert uiteindelijk een array met gegevens die betrekking hebben op het bovenste zoekresultaat dat is geparseerd vanuit een XML-antwoord. (In veel gevallen zal het eerste resultaat het product zijn dat we willen, ervan uitgaande dat de sleutelzin die we leveren specifiek genoeg is. Als een alternatief, kunt u besluiten dit voorbeeld te wijzigen om te zoeken op basis van het specifieke ASIN- of ID-nummer van het product in plaats daarvan, maar er zijn voor- en nadelen aan deze methode.Als u een grote database van artikelpagina's voor verschillende films hebt, zal het meest waarschijnlijk efficiënter werken met een naamgerichte benadering, omdat u hierdoor automatisch productlinks voor alle films kunt genereren van uw artikelen direct, en bespaart u de extra tijd en moeite om handmatig naar boven te moeten zoeken en ID's voor elke artikel in te voegen.)

Een ondertekend verzoek genereren

De volgende stap is om een ​​helperklasse toe te voegen die het ondertekende verzoek naar de product-API zal maken. Ik gebruikte een externe functie geschreven door Ulrich Mierendorff en verpakte het in zijn eigen statische klasse genaamd AWSSignedRequest. Er zijn verschillende parameters nodig, waaronder de regio (voor de Amerikaanse winkel gebruiken we 'com'), een reeks verzoekparameters, onze AWS-sleutels, reactiegroepen en de API-versie die we al hebben gedefinieerd. De get_signed_request () methode bouwt en retourneert in feite een volledige URL-aanvraagreeks van al deze stukjes.

De uiteindelijke URL van het ondertekende verzoek ziet er als volgt uit:

http://webservices.amazon.com/onca/xml? AWSAccessKeyId = AKIAJILHUTAJ5MMQRJWA & AssociateTag = envtut-20 & Operation = ItemSearch & ResponseGroup = Small% 2CImages% 2COfferSummary & SearchIndex = Movies & Service = AWSECommerceService & Timestamp = 2015-11-06T20% 3A34% 3A52Z & Title = Jurassic% 20World & Version = 2013-08-01 & Signature = nwkfvvLCvl11Cunuthz6orXCbBMnBc1Z7S3HSfYW % 2B14% 3D

In de AmazonAssocHelper klas, plaats de oproep naar get_signed_request () in een methode genaamd get_search_results ()en geef een reeks door met daarin vier zoekparameters ($ params) samen met de andere argumenten zoals hieronder weergegeven:

 / ** * Voert zoekopdracht uit met ondertekende aanvraag op product-API met behulp van sleutelzin en categorienaam * retourneert: XML-object * / persoonlijke statische functie get_search_results ($ keyphrase, $ search_index) // Definieer de aanvraag $ params = array ("SearchIndex" = > $ search_index, // de categorie "Title" => $ keyphrase, "Operation" => self :: $ operation, "ResponseGroup" => self :: $ response_group); $ request = AWSSignedRequest :: get_signed_request ('com', $ params, self :: AMZ_ASSOC_ACCESSKEY, self :: AMZ_ASSOC_SECRETKEY, self :: AMZ_ASSOC_TAG, self :: $ version); $ response = file_get_contents ($ request); // voor het testen van / * header ('Content-type: application / xml'); echo $ antwoord; exit; * / return simplexml_load_string ($ antwoord); 

Onze $ params array bevat de bewerking en het antwoord dat we al hebben gedefinieerd, evenals waarden voor 'Title' en 'SearchIndex'. In dit geval is de SearchIndex gewoon de productcategorie waarnaar we zoeken. Nu kunnen we de ingebouwde PHP gebruiken file_get_contents () functie om een ​​reactie van de aanvraag te genereren, en aangezien de reactie een XML-document is, gebruiken we een andere ingebouwde functie, simplexml_load_string (), om het te laden als een object dat we kunnen analyseren. 

De respons testen en voorbeelden van XML-gegevens bekijken

Op dit punt willen we onze API-aanvraag kunnen uitproberen met enkele echte productwaarden, zodat we een concreet voorbeeld kunnen zien van hoe onze geretourneerde XML-gegevens eruitzien voordat deze wordt geparseerd. Zoals hierboven is weergegeven, voegt u enkele testregels toe om de koptekst in te stellen op toepassing / XML en de $ response voordat het wordt geretourneerd.

Maak nu een bestand dat zal dienen als de hoofdpagina waar de productkoppeling wordt getoond. Ik heb besloten het te noemen index.php. Voeg bovenaan het volgende stukje code toe:

De eerste twee regels verklaren onze naamruimte en bevatten een globale functie waarmee onze klassenbestanden automatisch kunnen worden geladen, omdat we geen PHP-framework gebruiken. De volgende regel is de belangrijkste. We noemen het fetch_product_data () openbare methode op onze AmazonAssocHelper class en wijs het toe aan een array-variabele genaamd $ product_data, het doorgeven van een specifieke filmnaam als de sleutelzin (ik koos "Jurassic World" uit de huidige lijst van bestsellers) en "Movies" als de categorie. 

Wanneer u uw pagina laadt, ziet het begin van uw XML-reactie er als volgt uit:

  807ede04-f196-44a0-99ff-ff1bb1c12fee             ,0887890000000000   ...  37 4 ...   B016W01EXI  http://www.amazon.com/Jurassic-World-Chris-Pratt/dp/B016W01EXI%3FSubscriptionId%3DAKIAJILHUTAJ5MMQRJWA%26tag%3Denvtut-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB016W01EXI    Technische details  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  

Als je scrolt en de uitvoer scant, zou je alle gegevens moeten zien die nuttig zullen zijn voor onze demo, inclusief de , </code>, <code><LargeImage></code>, en <code><LowestNewPrice></code>. Er zijn de knooppunten die we zullen focussen op parsen.</p><h2>Het Response-object parseren</h2><p>In de <code>AmazonAssocHelper</code> class, maak een andere methode genaamd <code>get_top_result_data ()</code> dat neemt ons XML-antwoordobject als parameter. We kunnen nu beginnen met het lezen van de knooppunten die de gegevens bevatten die we willen vastleggen, maar voordat we daarheen gaan, laten we een aantal fouten controleren. Ik heb een paar regels boven aan onze functie toegevoegd om een ​​methode aan te roepen die zorgt voor het ontleden van Error-knooppunten voor ons, en ik zal dat in meer detail bespreken aan het einde van deze tutorial.</p><pre> / ** * Parses topresultaatknooppunt, en zijn attributen, van XML-object * retourneert: reeks productgegevens * / persoonlijke statische functie get_top_result_data ($ xml) if (! Empty (self :: handle_errors ($ xml))) return array ('error' => self :: handle_errors ($ xml)); // haal het eerste resultaatknooppunt $ first_item = $ xml-> Items [0] -> Item; $ item_title = $ first_item-> ItemAttributes-> Titel; $ item_link = $ first_item-> DetailPageURL; $ item_image = $ first_item-> LargeImage-> URL; $ item_price = $ first_item-> OfferSummary-> LaagsteNewPrice-> FormattedPrice; return array ('title' => (string) $ item_title, 'link' => (string) $ item_link, 'image' => (string) $ item_image, 'price' => (string) $ item_price); </pre><p>Zoals je in de bovenstaande code kunt zien, beginnen we met het ophalen van het eerste itemknooppunt (<code>Item [0]</code>) van het XML-object en opslaan in een variabele (<code>$ FIRST_ITEM</code>). Vervolgens werken we met elk van zijn kinderen om de gewenste informatie te verzamelen (<code>$ ITEM_TITLE</code>, <code>$ ITEM_LINK</code>, <code>$ item_image</code>, <code>$ ITEM_PRICE</code>). Ten slotte verpakken we alles in een array met benoemde attributen en retourneren we de array.</p><h2>Omgaan met fouten</h2><p>Maak een methode genaamd <code>handle_errors ()</code>en geef hetzelfde XML-object door. Op basis van de manier waarop deze API is ingesteld, worden meerdere foutknopen met specifieke codes en berichten ingesteld om te verschijnen in de <code><OperationRequest></code> knooppunt of de items <code><Request></code> knooppunt. U kunt hiervoor testen door een ongeldige zoekindex of responsgroep in te stellen. De volgende code doorloopt elk knooppunt en duwt de foutberichten naar een array die we retourneren:</p><pre>/ ** * Controleert op fouten in het verzoek / resultaat * retourneert: array met bericht (en) met de beschrijving van de "fout" * / private statische functie handle_errors ($ xml) $ errors_arr = array (); // verwerkingsfouten in request foreach ($ xml-> OperationRequest-> Errors-> Error as $ error) error_log ("Foutcode:". $ error-> Code. "\ r \ n"); error_log ($ error-> Message. "\ r \ n"); error_log ( "\ r \ n"); array_push ($ errors_arr, (string) $ error-> Message); // controleren op ongeldige categorie, geen overeenkomsten of andere zoekfout voor elk ($ xml-> Items-> Verzoek-> Fouten-> Fout als $ fout) error_log ("Foutcode:". $ fout-> Code. "\ r \ n"); error_log ($ error-> Message. "\ r \ n"); error_log ( "\ r \ n"); array_push ($ errors_arr, (string) $ error-> Message); return $ errors_arr; </pre><h2>De gegevens vullen in een HTML-sjabloon</h2><p>Op dit punt kunt u de XML-testoproepen verwijderen omdat we klaar zijn om naar de uiteindelijke gegevensuitvoer te kijken. In index.php, print de geretourneerde <code>$ product_data array</code> en laad de pagina. Je zou zoiets als dit moeten zien:</p><pre>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 [prijs] => $ 5,99)</pre><p>Nadat u hebt gecontroleerd of de gegevens er correct uitzien voor elk van de vier eigenschappen waarin we zijn geïnteresseerd, kunt u proberen het gesprek voor andere films of producten uit te voeren. Merk op dat de partner-ID (in dit geval "envtut-20") automatisch in de 'link' is ingevoegd zoals we kunnen verwachten.</p><p>Laten we als laatste stap een eenvoudig HTML-blok coderen om onze filmgegevens weer te geven en deze te koppelen aan de aankooppagina. In <em>index.php</em>, voeg het volgende toe onder het PHP-blok:</p><pre><!doctype html> <html> <head> <title>Tuts + demo: Amazon Product API

"target =" _ blank "> <?php echo $product_data['title']; ?>

"target =" _ blank ">

op Amazon

"target =" _ blank "> Nu kopen

Merk op dat in het geval dat een fout wordt geretourneerd, ik heb gekozen om het scherm helemaal te verbergen, maar als alternatief zou je de juiste foutmelding op zijn plaats kunnen zetten. 

Nu, met toevoeging van CSS-stijlen, zou de uiteindelijke uitvoer er ongeveer zo uitzien:

En daar heb je het! Nadat u uw affiliate-module ter wereld heeft geopend, kunt u alle aankopen en inkomsten bijhouden door u aan te melden bij uw account. 

Conclusie

In deze zelfstudie hebben we alle stappen besproken die nodig zijn voor een PHP-programmeur om een ​​schaalbare code-oplossing te bouwen die onmiddellijk een aangepaste affiliate-link genereert voor vrijwel elk product in de Amazon Store. Op basis van uw behoeften of voorkeuren kunt u besluiten dit voorbeeld met verschillende parameters te wijzigen of uit te breiden. 

U kunt de API-documentatie ook zelf in meer detail verkennen om nog meer te ontdekken van wat mogelijk is. De echte kracht van het gebruik van de Product Merchandising API ligt in de flexibiliteit die het biedt voor het ordenen en weergeven van een volledige reeks van real-time informatie over een product of een lijst met producten. Met Amazon's standaard linkgenerator (geen codeerkennis vereist), krijgt u niet bijna dezelfde hoeveelheid controle, en uw opties zijn beperkt. 

De API schijnt echt op webpagina's die dynamisch worden gegenereerd en op pagina's waar u meer controle wilt over het uiterlijk van uw links, dus als u op deze manier aan een website of blog werkt en inkomsten wilt genereren, hoop ik dat u deze tutorial nuttig vond.