Advertisement
  1. Code
  2. PHP

Erstellen Sie einen benutzerdefinierten Partner-Link mit der Amazon Product Merchandising API

Scroll to top
Read Time: 12 min

() translation by (you can also view the original English article)

Das Amazon Associates-Programm bietet Entwicklern in Verbindung mit Amazon Web Services (AWS) eine leistungsstarke Möglichkeit, den Amazon Store-Katalog mithilfe einer RESTful-API zu durchsuchen und Daten für praktisch alle Produktlisten in eine Webseite zu integrieren. Wenn Sie ein Programmierer mit einer geschäftlichen Einstellung sind und nach Möglichkeiten suchen, Ihre Website zu monetarisieren, können Sie sich als Amazon-Partner anmelden und eine Provision erhalten, wenn ein Nutzer auf Ihren Produkt-Link klickt und einen Kauf abschließt. (Und was Partnerprogramme angeht, gehören die Provisionen von Amazon zu den großzügigsten.)

Nehmen wir an, Sie betreiben einen Blog oder eine Website mit Filmkritiken. Für jeden veröffentlichten Filmbericht können Sie davon profitieren, indem Sie einen Link für den Leser angeben, um den Film in der Nähe Ihres Artikels zu kaufen. Um das Klicken attraktiver zu gestalten, kann der Link ein Miniaturbild der DVD, den vollständigen Namen des Films, den niedrigsten verfügbaren Preis und eine Schaltfläche "Kaufen" enthalten.

In diesem Tutorial zeige ich Ihnen, wie Sie eine dedizierte, wiederverwendbare Klasse in PHP erstellen, die eine Verbindung zur Product Merchandising API herstellt und XML-Daten basierend auf dem Namen des Produkts und der Einkaufskategorie (in diesem Fall "Movies") abruft. Am Ende füllen wir diese Daten in eine kleine, vollständig anpassbare HTML-Vorlage, so dass wir eine funktionierende Demo eines Mini-Affiliate-Moduls erhalten. Lass uns anfangen.

[Bitte beachten Sie vor dem Aufrufen der Beispieldemo, dass die Zahlung einer Provision an Envato Tuts + erfolgt, wenn Sie sich entscheiden, die DVD über den angegebenen Link zu kaufen oder zu mieten.]

Registrierung für eine Partner-ID und Abrufen von Anmeldeinformationen

Eröffnen Sie zunächst ein Konto bei affiliate-program.amazon.com. Es ist kostenlos und Sie müssen nur die Schritte befolgen, um ein Profil für Ihre Website zu erstellen. Sie werden aufgefordert, Ihre Identität am Ende des Vorgangs zu bestätigen, indem Sie Ihre Telefonnummer eingeben, einen automatisierten Anruf erhalten und den Passcode eingeben, den Sie erhalten haben.

Wenn Sie die Registrierung abgeschlossen haben, erhalten Sie eine Amazon-Partner-ID (in diesem Beispiel "envtuts-20"). Melden Sie sich mit Ihrem Benutzernamen und Kennwort in Ihrem Hauptkonto-Bereich an und klicken Sie auf die Registerkarte Product Merchandising API. Klicken Sie dort auf den Link, um die API zu verwenden.

Sie müssen sich bei Amazon Web Services (aws.amazon.com) anmelden, sofern Sie dies noch nicht getan haben. In der AWS-Konsole können Sie unter Sicherheitsberechtigungsnachweise einen Zugriffsschlüssel und einen geheimen Schlüssel zum Erstellen von API-Anforderungen generieren. (Hinweis: Es ist wichtig, dass diese Anmeldeinformationen privat und sicher bleiben. Niemals öffentlich auf GitHub oder sonstwo online verfügbar machen.)

Einrichten unserer PHP Helper-Klasse

Zum Zwecke dieses Beispiels und um die Dinge relativ einfach zu halten, implementieren wir das Singleton-Entwurfsmuster, um eine statische Hilfsklasse namens AmazonAssocHelper zu erstellen. Sie enthält eine öffentliche Methode, die eine Verbindung zur API herstellt, den Katalog durchsucht und Produktdaten mithilfe bestimmter Parameter zurückgibt, die wir übergeben. So habe ich es eingerichtet:

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
}

Die ersten paar Zeilen deklarieren einen Namespace für unsere Klasse und enthalten eine Klasse eines Drittanbieters, die wir benötigen, um mit unseren Anmeldeinformationen eine signierte Anforderung an die API zu stellen. Die drei Konstanten, die ich definiert habe, sind unsere wichtige Partner-ID, die wir nach der Anmeldung erhalten haben, sowie den AWS-Zugriffsschlüssel und den geheimen Schlüssel. Wenn wir unsere API-Anfragen stellen, wird die Partner-ID automatisch in den Produktlink eingefügt, den wir abrufen, damit Einkäufe auf unser Konto zurückverfolgt werden können und wir bezahlt werden! Stellen Sie sicher, dass Sie alle drei Werte für sich selbst ausfüllen.

Die drei privaten Variablen beziehen sich auf Suchparameter, die wir für jede Anfrage angeben. Ich benutze "ItemSearch" als unsere Operationswahl, um Ergebnisse nachzuschlagen. "2013-08-01" ist das Datum der neuesten API-Version, die wir auch für unsere signierte Anfrage bereitstellen müssen, und schließlich müssen wir angeben, welche Antwortgruppen wir zurückgeben möchten. Es gibt insgesamt 55 Auswahlmöglichkeiten, die sich in Größe und Art der zurückgegebenen Daten unterscheiden. Für unsere Zwecke suchen wir nach dem vollständigen Titel des Films und der vollständigen URL für die Detailseite. Beide befinden sich in der Antwortgruppe "Klein". Wir benötigen auch ein Miniaturbild aus der Antwortgruppe "Bilder" und den niedrigsten neuen Preis aus der Gruppe "AngebotZusammenfassung".

Die Funktion fetch_product_data() ist unsere öffentlich zugängliche Methode, die zwei Parameter verwendet:

  1. eine bestimmte Schlüsselphrase, die sich auf den Namen des Produkts bezieht, nach dem gesucht werden soll
  2. eine akzeptierte Amazon-Produktkategorie

Am Ende wird ein Array von Daten zurückgegeben, das sich auf das aus einer XML-Antwort analysierte erste Suchergebnis bezieht. (In vielen Fällen ist das erste Ergebnis das gewünschte Produkt, vorausgesetzt, der von uns gelieferte Schlüsselsatz ist ausreichend.) Alternativ können Sie dieses Beispiel so ändern, dass es nach der spezifischen ASIN- oder ID-Nummer des Produkts sucht Stattdessen gibt es für diese Methode Vor- und Nachteile. Wenn Sie über eine umfangreiche Datenbank mit Artikelseiten für verschiedene Filme verfügen, ist die Verwendung eines namenbasierten Ansatzes höchstwahrscheinlich effizienter, da Sie damit automatisch Produktverknüpfungen für alle Ihre Artikel automatisch generieren können Mühe, IDs manuell suchen und einfügen zu müssen.)

Eine signierte Anfrage erstellen

Im nächsten Schritt fügen Sie eine Hilfsklasse hinzu, die die signierte Anforderung an die Produkt-API sendet. Ich habe eine von Ulrich Mierendorff geschriebene Funktion eines Drittanbieters verwendet und in eine eigene statische Klasse namens AWSSignedRequest verpackt. Dazu sind mehrere Parameter erforderlich, darunter die Region (für den US-Store verwenden wir "com"), ein Array von Anforderungsparametern, unsere AWS-Schlüssel, Antwortgruppen und die bereits definierte API-Version. Die get_signed_request() -Methode erstellt im Wesentlichen eine vollständige URL-Anforderungszeichenfolge aus allen diesen Teilen.

Die endgültige signierte Anforderungs-URL sieht folgendermaßen aus:

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

Platzieren Sie in der AmazonAssocHelper-Klasse den Aufruf von get_signed_request () in einer Methode mit dem Namen get_search_results (), und übergeben Sie ein Array mit vier Suchparametern ($params) und den anderen Argumenten wie folgt:

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
	}

Unser $params-Array enthält die Operation und die Antwort, die wir bereits definiert haben, sowie Werte für 'Title' und 'SearchIndex'. In diesem Fall ist der SearchIndex einfach die Produktkategorie, nach der wir suchen. Jetzt können wir die integrierte file_get_contents()- Funktion von PHP aufrufen, um eine Antwort aus der Anforderung zu generieren. Da es sich bei der Antwort um ein XML-Dokument handelt, verwenden wir eine andere integrierte Funktion, simplexml_load_string(), um sie als ein von uns geladenes Objekt zu laden kann analysieren.

Antwort testen und XML-Daten in der Vorschau anzeigen

An dieser Stelle möchten wir unsere API-Anfrage mit einigen echten Produktwerten ausprobieren können, damit wir ein Beispiel sehen können, wie unsere zurückgegebenen XML-Daten aussehen, bevor sie analysiert werden. Fügen Sie wie oben gezeigt einige Testzeilen hinzu, um den Header auf application / XML zu setzen, und drucken Sie die $response aus, bevor sie zurückgegeben wird.

Erstellen Sie nun eine Datei, die als Hauptseite dient, auf der der Produktlink angezeigt wird. Ich habe mich entschieden, es index.php zu nennen. Fügen Sie oben den folgenden Code ein:

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
?>

Die ersten beiden Zeilen deklarieren unseren Namespace und enthalten eine globale Funktion, mit der unsere Klassendateien automatisch geladen werden können, da wir kein PHP-Framework verwenden. Die nächste Zeile ist die wichtige. Wir rufen die öffentliche Methode fetch_product_data() in unserer AmazonAssocHelper-Klasse auf und ordnen sie einer Array-Variablen mit dem Namen $product_data zu. Dabei übergeben wir einen bestimmten Filmnamen als Schlüsselphrase (Ich habe "Jurassic World" aus der aktuellen Liste der Bestseller gewählt) und "Filme" als Kategorie.

Wenn Sie Ihre Seite laden, sollte der Anfang Ihrer XML-Antwort folgendermaßen aussehen:

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>

Wenn Sie die Ausgabe scrollen und scannen, sollten Sie in der Lage sein, alle Daten zu sehen, die für unsere Demo nützlich sind, einschließlich <DetailPageURL>,<Title>,<LargeImage>und<LowestNewPrice>,<LargeImage>und<LowestNewPrice>.Es gibt die Knoten, auf die wir uns beim Parsen konzentrieren werden., <LargeImage> und <LowestNewPrice>. Es gibt die Knoten, auf die wir uns beim Parsen konzentrieren werden.

Parsen des Antwortobjekts

Erstellen Sie in der AmazonAssocHelper-Klasse eine andere Methode namens get_top_result_data(), die unser XML-Antwortobjekt als Parameter verwendet. Wir können jetzt mit dem Lesen der Knoten beginnen, die die Daten enthalten, die wir erfassen möchten. Bevor wir jedoch dorthin gehen, wollen wir einige Fehlerprüfungen einplanen. Ich habe am Anfang unserer Funktion ein paar Zeilen hinzugefügt, um eine Methode aufzurufen, die das Parsen von Error-Knoten für uns übernimmt.

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
	}

Wie Sie im obigen Code sehen können, rufen wir zunächst den ersten Elementknoten (Item[0]) aus dem XML-Objekt ab und speichern ihn in einer Variablen ($first_item). Anschließend führen wir für jedes seiner untergeordneten Elemente die erforderlichen Informationen aus ($item_title, $item_link, $item_image, $item_price). Zum Schluss packen wir alles in ein Array mit benannten Attributen und geben das Array zurück.

Fehler behandeln

Erstellen Sie eine Methode namens handle_errors() und übergeben Sie dasselbe XML-Objekt. Je nachdem, wie diese API eingerichtet ist, werden mehrere Fehlerknoten mit bestimmten Codes und Meldungen so eingestellt, dass sie entweder im<OoerationRequest>-Knoten oder im Items<Request>-Knoten erscheinen. Sie können dies testen, indem Sie einen ungültigen Suchindex oder eine Antwortgruppe festlegen. Der folgende Code durchläuft jeden Knoten und schiebt die Fehlermeldungen in ein Array, das wir zurückgeben:

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
	}

Füllen der Daten in einer HTML-Vorlage

An diesem Punkt können Sie die XML-Testaufrufe entfernen, da wir die endgültige Datenausgabe betrachten können. Drucken Sie in index.php das zurückgegebene $product_data array und laden Sie die Seite. Sie sollten so etwas sehen:

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 )

Wenn Sie sich vergewissert haben, dass die Daten für jede der vier Eigenschaften, an denen wir interessiert sind, richtig aussehen, können Sie den Anruf für andere Filme oder Produkte zum Vergleich ausführen. Beachten Sie, dass die Partner-ID (in diesem Fall "envtut-20") wie erwartet automatisch in den Link eingefügt wurde.

Als letzten Schritt kodieren wir einen einfachen HTML-Block, um unsere Filmdaten anzuzeigen und mit der Kaufseite zu verknüpfen. Fügen Sie in der Datei index.php unter dem PHP-Block Folgendes hinzu:

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>

Beachten Sie, dass ich mich im Falle einer Fehlermeldung dafür entschieden habe, die Anzeige vollständig auszublenden. Alternativ können Sie stattdessen die entsprechende Fehlermeldung anzeigen.

Wenn nun CSS-Stile hinzugefügt werden, sieht die endgültige Ausgabe etwa so aus:

Amazon Affiliate Link Demo

Und da hast du es! Sobald Sie Ihr Affiliate-Modul in der Welt eingeführt haben, können Sie alle Einkäufe und Einnahmen nachverfolgen, indem Sie sich bei Ihrem Konto anmelden.

Fazit

In diesem Tutorial haben wir alle Schritte beschrieben, die ein PHP-Programmierer benötigt, um eine skalierbare Codelösung zu erstellen, die sofort einen benutzerdefinierten Partner-Link für praktisch jedes Produkt im Amazon Store generiert. Je nach Ihren Bedürfnissen oder Vorlieben können Sie dieses Beispiel mit anderen Parametern ändern oder erweitern.

Sie können auch die API-Dokumentation selbst ausführlicher untersuchen, um noch mehr Möglichkeiten zu entdecken. Die wirkliche Kraft bei der Verwendung der Product Merchandising-API liegt in der Flexibilität, die sie bietet, um eine vollständige Palette von Echtzeitinformationen zu einem Produkt oder einer Liste von Produkten zu erstellen und anzuzeigen. Mit dem Standard-Link-Generator von Amazon (keine Codierkenntnisse erforderlich) erhalten Sie nicht annähernd dieselbe Kontrolle und Ihre Optionen sind begrenzt.

Die API zeigt sich wirklich auf Webseiten, die dynamisch generiert werden, und auf Seiten, auf denen Sie mehr Kontrolle über das Erscheinungsbild Ihrer Links benötigen. Wenn Sie also an einer Website oder einem Blog in dieser Hinsicht arbeiten und eine Monetarisierung wünschen, hoffe ich dass Sie dieses Tutorial nützlich gefunden haben.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.