使用Amazon Product Merchandising API构建自定义会员链接

Amazon Associates程序与Amazon Web Services(AWS)结合使用,为开发人员提供了一种强大的手段,可以使用RESTful API搜索Amazon Store的目录,并将几乎所有产品列表的数据集成到网页中。 如果您是一名具有商业思维的程序员,并且正在寻找通过网站获利的方法,那么您可以注册成为Amazon会员,每次用户单击您的产品链接并完成购买时即可赚取佣金。 (就会员收入计划而言,亚马逊的佣金是最慷慨的。)

对于那些不熟悉会员营销理念的人,让我们假设您正在运行一个具有电影评论的博客或网站。 对于发布的每部电影评论,您都可以通过在读者文章附近的位置添加一个链接来使读者购买该电影而受益。 为了使点击更具吸引力,该链接可以包括DVD的缩略图,完整的电影名称,可用的最低价格以及“购买”按钮。

在本教程中,我将向您展示如何在PHP中创建一个专用的,可重用的类,该类可连接到Product Merchandising API,并根据产品名称和购物类别(在本例中为“ Movies”)获取XML数据。 最后,我们会将数据填充到一个完全可自定义的小型HTML模板中,从而最终获得一个迷你会员模块的工作演示。 让我们开始吧。

[请在访问示例演示之前注意,如果您选择从提供的链接中购买或租借DVD,则将向Envato Tuts +支付佣金。]

注册会员ID和获取凭据

首先,在affiliate-program.amazon.com上注册一个帐户。 它是免费的,您只需要按照以下步骤为网站创建个人资料即可。 在过程结束时,系统会要求您输入电话号码,接听自动电话并输入密码,以验证您的身份。

完成注册后,将为您提供Amazon Affiliate ID(在此示例中为“ envtuts-20”)。 使用用户名和密码登录到您的主帐户区域,然后单击“ 产品销售API”选项卡。 在此处,单击链接以开始使用API​​。

如果尚未注册,则需要注册Amazon Web Services(aws.amazon.com)。 在AWS控制台的“ 安全凭据”下 ,您可以生成用于发出API请求的访问密钥和秘密密钥。 ( 注意:确保这些凭据的私密性和安全性很重要。切勿在GitHub或其他任何在线位置公开公开这些凭据。

设置我们的PHP Helper类

出于本示例的目的,并且为了使事情保持相对简单,我们将实现Singleton设计模式来创建一个名为AmazonAssocHelper的静态帮助器类 它将包含一个公共方法,该方法可连接到API,搜索目录并使用我们传递的某些参数返回产品数据。 这是我的设置方法:

<?php


namespace App\Services;

use App\lib\vendor\aws\AWSSignedRequest;


class AmazonAssocHelper {

	//AMAZON AFFILIATE PROGRAM ACCESS -- sign into affiliate-program.amazon.com
	const AMZ_ASSOC_TAG = 'your-affiliate-id';

	//AWS credentials -- sign into aws.amazon.com
	const AMZ_ASSOC_ACCESSKEY = 'YOUR_ACCESS_KEY';  
	const AMZ_ASSOC_SECRETKEY = 'YOUR_SECRET_KEY';  

	//Set the values for some of the search parameters
	private static $operation = "ItemSearch";
	private static $version = "2013-08-01";
	private static $response_group = "Small,Images,OfferSummary";

	protected function __construct() {

	}

	/**
	* Fetches relevant product data in product API from keyphrase and category
	* returns: array of data from the top result node
	*/
	public static function fetch_product_data($keyphrase, $category) {
	
		$result_xml = self::get_search_results($keyphrase, $category);
		
		//return an array containing the item name, link, image, and price
		return self::get_top_result_data($result_xml);
	
	}


}

前两行为我们的类声明一个名称空间,并包括一个第三方类,我们需要使用我们的凭据向API提出签名请求。 我定义的三个常量是我们在注册后获得的至关重要的会员ID,以及AWS访问密钥和秘密密钥。 当我们发出API请求时,会员ID会自动插入到我们检索的产品链接中,以便可以将购买的商品适当地追溯到我们的帐户并获得付款! 确保自己填写所有这三个值。

这三个私有变量指的是我们将为每个请求提供的搜索参数。 我使用“ ItemSearch”作为我们的操作选择来查找结果。 “ 2013-08-01”是最新API版本的日期,我们还需要提供该API版本给我们的签名请求,最后,我们必须指定我们要返回的响应组。 共有55种选择,它们的大小和返回的数据类型各不相同。 出于我们的目的,我们正在寻找电影的完整标题和详细信息页面的完整URL,这两者均在“小”响应组中。 我们还需要“图像”响应组中的缩略图,以及“ OfferSummary”组中的最低新价格。

fetch_product_data()函数是我们的公开方法,它fetch_product_data()两个参数:

  1. 一个特定的关键词,指的是我们要搜索的产品名称
  2. 可接受的亚马逊产品类别

最终,它将返回与从XML响应中解析出的顶部搜索结果有关的数据数组。 (在许多情况下,第一个结果将是我们想要的产品,假设我们提供的密钥短语足够具体。作为替代,您可以决定修改此示例,以按产品的特定ASIN或ID号进行搜索相反,但是这种方法是有利有弊的。如果您拥有大量不同电影的文章页面数据库,则使用基于名称的方法最有可能被证明是更有效的,因为它将允许您自动为所有电影生成产品链接立即撰写大量文章,为您省去了手动和查找ID所需的额外时间和精力。)

生成签名的请求

下一步是添加一个帮助程序类,它将对产品API发出已签名的请求。 我使用了Ulrich Mierendorff编写的第三方函数,并将其包装在自己的静态类AWSSignedRequest 。 它需要几个参数,包括区域(在美国商店中,我们使用“ com”),请求参数数组,AWS密钥,响应组以及我们已经定义的API版本。 get_signed_request()方法本质上是从所有这些部分构建并返回完整的URL请求字符串。

最终签名的请求URL将如下所示:

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

AmazonAssocHelper类中, get_signed_request()的调用get_search_results()称为get_search_results()的方法中   并传递一个包含四个搜索参数( $params )以及其他参数的数组,如下所示:

/**
    * Runs search with signed request on product API using keyphrase and category name
	* returns: XML object
	*/
	private static function get_search_results($keyphrase, $search_index) {
		
		//Define the request
		$params = array("SearchIndex"=>$search_index, //the category
						"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);
        
        //for testing
        /*header('Content-type: application/xml');
    	echo $response;
		exit;*/
        
		return simplexml_load_string($response);
		
	}

我们的$params数组包括我们已经定义的操作和响应,以及'Title'和'SearchIndex'的值。 在这种情况下,SearchIndex只是我们要搜索的产品类别。 现在,我们可以调用PHP的内置file_get_contents()函数从请求中生成响应,并且由于该响应是XML文档,因此我们使用了另一个内置函数simplexml_load_string() ,将其作为对象加载,可以解析。

测试响应并预览XML数据

此时,我们希望能够使用一些实际的产品值来尝试我们的API请求,以便在解析之前可以看到返回的XML数据的实际示例。 如上所示,添加一些测试行以将标头设置为application / XML并在返回$response之前将其打印出来。

现在,创建一个文件,该文件将用作显示产品链接的主页。 我决定将其命名为index.php 。 在顶部,添加以下代码:

<?php

    namespace App\Services;

	require_once getcwd() . '/App/app_global.php';

	/**
	*	Call the Product API by passing in the name of the product and the shopping category
	*	("Books", "Movies", and "VideoGames" are examples -- see API documentation for full list)
	*/
	$product_data = AmazonAssocHelper::fetch_product_data("Jurassic World", "Movies");


?>

前两行声明了我们的名称空间,并包含一个全局函数,该函数允许我们自动加载类文件,因为我们没有使用PHP框架。 下一行很重要。 我们在AmazonAssocHelper类上调用fetch_product_data()公共方法,并将其分配给名为$product_data的数组变量,并传入特定的电影名称作为关键短语(我从当前畅销AmazonAssocHelper选择了《侏罗纪世界》)。 “电影”为类别。

加载页面时,XML响应的开始应如下所示:

<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2013-08-01">
<OperationRequest>
<RequestId>807ede04-f196-44a0-99ff-ff1bb1c12fee</RequestId>
<Arguments>
<Argument Name="AWSAccessKeyId" Value="AWS_ACCESS_KEY"/>
<Argument Name="AssociateTag" Value="envtut-20"/>
<Argument Name="Operation" Value="ItemSearch"/>
<Argument Name="ResponseGroup" Value="Small,Images,OfferSummary"/>
<Argument Name="SearchIndex" Value="Movies"/>
<Argument Name="Service" Value="AWSECommerceService"/>
<Argument Name="Timestamp" Value="2015-11-03T21:32:57Z"/>
<Argument Name="Title" Value="Jurassic World"/>
<Argument Name="Version" Value="2013-08-01"/>
<Argument Name="Signature" Value="QhUpga/f2MReU4xpdzCr432hMvxeA72N+v+G0hVi17M="/>
</Arguments>
<RequestProcessingTime>0.0887890000000000</RequestProcessingTime>
</OperationRequest>
<Items>
<Request>...</Request>
<TotalResults>37</TotalResults>
<TotalPages>4</TotalPages>
<MoreSearchResultsUrl>...</MoreSearchResultsUrl>
<Item>
<ASIN>B016W01EXI</ASIN>
<DetailPageURL>
http://www.amazon.com/Jurassic-World-Chris-Pratt/dp/B016W01EXI%3FSubscriptionId%3DAKIAJILHUTAJ5MMQRJWA%26tag%3Denvtut-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB016W01EXI
</DetailPageURL>
<ItemLinks>
<ItemLink>
<Description>Technical Details</Description>
<URL>
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
</URL>
</ItemLink>

如果滚动并扫描输出,则应该能够看到对我们的演示有用的所有数据,包括<DetailPageURL><Title><LargeImage><LowestNewPrice> 。 我们将重点分析节点。

解析响应对象

AmazonAssocHelper类中,创建另一个名为get_top_result_data()方法,该方法将我们的XML响应对象作为参数。 现在,我们可以开始读取包含要捕获的数据的节点,但是在我们去那里之前,让我们计划合并一些错误检查。 我在函数的顶部添加了几行代码来调用一个方法,该方法将为我们解析Error节点,在本教程结束时,我将对其进行详细介绍。

/**
    * Parses top result node, and its attributes, from XML object
	* returns: array of product data
	*/
	private static function get_top_result_data($xml) {

		if (!empty(self::handle_errors($xml))) {
			return array('error'=>self::handle_errors($xml));
		}

		//get the first result node
		$first_item = $xml->Items[0]->Item; 
		$item_title = $first_item->ItemAttributes->Title;
		$item_link = $first_item->DetailPageURL;
		$item_image = $first_item->LargeImage->URL;
		$item_price = $first_item->OfferSummary->LowestNewPrice->FormattedPrice;

		return array( 'title'=>(string)$item_title,
					  'link'=>(string)$item_link, 
					  'image'=>(string)$item_image, 
					  'price'=>(string)$item_price );

		

	}

如您在上面的代码中看到的,我们首先从XML对象中检索第一个项目节点( Item[0] ),并将其存储在变量( $first_item )中。 然后,我们对其每个子级进行操作以收集所需的信息( $item_title$item_link$item_image$item_price )。 最后,我们将其全部打包到具有命名属性的数组中并返回该数组。

处理错误

创建一个名为handle_errors()的方法   并传递相同的XML对象。 根据此API的设置方式,具有特定代码和消息的多个错误节点被设置为显示在<OperationRequest>节点或Items <Request>节点中。 您可以通过设置无效的搜索索引或响应组来测试它们。 以下代码循环遍历每个节点,并将错误消息推送到我们返回的数组中:

/**
    * Checks for errors in the request/ result
	* returns: array with message(s) describing the "error"
	*/
	private static function handle_errors($xml) {

		$errors_arr = array();

		//process errors in request
		foreach ($xml->OperationRequest->Errors->Error as $error) {

		   	error_log("Error code: " . $error->Code . "\r\n");
		  	error_log($error->Message . "\r\n");
		  	error_log("\r\n");

		  	array_push($errors_arr, (string)$error->Message);
		}

		//check for invalid category, no matches, or other search error
		foreach ($xml->Items->Request->Errors->Error as $error) {
			
			error_log("Error code: " . $error->Code . "\r\n");
		  	error_log($error->Message . "\r\n");
		  	error_log("\r\n");

			array_push($errors_arr, (string)$error->Message);
		}
		

		return $errors_arr;

	}

在HTML模板中填充数据

此时,您可以删除XML测试调用,因为我们准备查看最终数据输出。 在index.php中,打印返回的$product_data array并加载页面。 您应该会看到以下内容:

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 )

验证完我们感兴趣的四个属性中的每个属性的数据看起来正确之后,您可以尝试在其他电影或产品上运行通话以进行比较。 请注意,会员ID(在本例中为“ envtut-20”)已自动插入“链接”,这是我们所期望的。

最后,让我们编写一个简单HTML代码块以显示我们的电影数据并将其链接到购买页面。 在index.php中 ,在PHP块下面添加以下内容:

<!doctype html>
<html>
    <head>
		<title>Tuts+ Demo: Amazon Product API</title>
        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
		<link rel="stylesheet" href="css/reset.css" />
		<link rel="stylesheet" href="css/style.css" />
	</head>
	<body>
		<?php if (!empty($product_data) && array_key_exists("error", $product_data) != 1): ?>
			<div class="affiliate_wrap">
				
				<a href="<?php echo $product_data['link']; ?>" target="_blank">
					<img src="<?php echo $product_data['image']; ?>" alt="<?php echo $product_data['title']; ?>" />
				</a>
				<h2>
					<a href="<?php echo $product_data['link']; ?>" target="_blank"><?php echo $product_data['title']; ?></a>
				</h2>
				<p><em><?php echo $product_data['price']; ?></em> on Amazon</p>
				<a class="button" href="<?php echo $product_data['link']; ?>" target="_blank">Buy Now</a>
			</div>

		<?php endif ?>
	</body>
</html>

请注意,如果返回了错误,我选择完全隐藏显示,但也可以在其位置显示适当的错误消息。

现在,添加CSS样式后,最终输出将如下所示:

亚马逊会员链接演示

在那里,您拥有了! 将您的会员模块发布到世界各地后,您可以登录帐户来跟踪所有购买和收入。

结论

在本教程中,我们介绍了PHP程序员构建可伸缩代码解决方案所需的所有步骤,该解决方案可立即为Amazon Store中的几乎所有产品生成自定义会员链接。 根据您的需要或偏好,您可以决定使用不同的参数来更改或扩展此示例。

您也可以自己更详细地浏览API文档,以发现更多可能的结果。 使用产品推销API的真正能力在于它提供的灵活性,可以安排和显示有关产品或产品列表的实时信息。 使用Amazon的默认链接生成器(无需任何编码知识),您获得的控制量几乎不相同,并且您的选择受到限制。

该API确实适用于动态生成的网页以及需要对链接的外观进行更高级别控制的页面,因此,如果您正在按照这些方针来开发网站或博客,并希望将获利纳入其中,我希望您发现本教程很有用。

翻译自: https://code.tutsplus.com/tutorials/build-a-custom-affiliate-link-with-the-amazon-product-merchandising-api--cms-25193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值