php - 使用 PHP 的 Amazon MWS API 未显示任何结果

标签 php api amazon-web-services amazon-mws

我一直在使用 amazon mws API 开发一个项目来查找最低价格报价,它与操作 ListMatchingProducts 和 GetMatchingProduct 配合使用效果很好,但是当涉及到 GetLowestPricedOffersForASIN 时,它在 XML 输出中没有显示结果

“此 XML 文件似乎没有任何与之关联的样式信息。文档树如下所示。”

我的 PHP 文件在这里:

<?php
$param = array();
$param['AWSAccessKeyId']   = ''; 
$param['Action']           = 'GetLowestPricedOffersForASIN';
$param['SellerId']         = ''; 
$param['SignatureMethod']  = 'HmacSHA256';  
$param['SignatureVersion'] = '2'; 
$param['Timestamp']        = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
$param['Version']          = '2011-10-01'; 
$param['MarketplaceId']    = 'ATVPDKIKX0DER'; 
$param['ItemCondition']    = 'used';
$param['ASIN']			   = '0439139600';
$secret = '';
$url = array();
foreach ($param as $key => $val) {

	$key = str_replace("%7E", "~", rawurlencode($key));
	$val = str_replace("%7E", "~", rawurlencode($val));
	$url[] = "{$key}={$val}";
}

sort($url);

$arr   = implode('&', $url);

$sign  = 'GET' . "\n";
$sign .= 'mws.amazonservices.com' . "\n";
$sign .= '/Products/2011-10-01' . "\n";
$sign .= $arr;

$signature = hash_hmac("sha256", $sign, $secret, true);
$signature = urlencode(base64_encode($signature));

$link  = "https://mws.amazonservices.com/Products/2011-10-01?";
$link .= $arr . "&Signature=" . $signature;
$ch = curl_init($link);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/xml'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
header('Content-type:text/xml');
echo $response;
我无法将 AWSAccessKeyID、Secret 和 SellerID 放在这里...

最佳答案

您的主要问题是,您使用 GET 而不是 POST。 此版本的代码有效:

$param = array();
$param['AWSAccessKeyId']   = ''; 
$param['Action']           = 'GetLowestPricedOffersForASIN';
$param['MarketplaceId']    = 'A1PA6795UKMFR9';
$param['SellerId']         = ''; 
$param['ASIN']             = 'B002BYQIWM'; 
$param['ItemCondition']    = 'New'; 
$param['SignatureMethod']  = 'HmacSHA256';  
$param['SignatureVersion'] = '2'; 
$param['Timestamp']        = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());
$param['Version']          = '2011-10-01'; 
$secret = '';
$url = array();
foreach ($param as $key => $val) {
                    $key = str_replace("%7E", "~", rawurlencode($key));
                        $val = str_replace("%7E", "~", rawurlencode($val));
                        $url[] = "{$key}={$val}";
}

sort($url);

$arr   = implode('&', $url);

$sign  = 'POST' . "\n";
$sign .= 'mws.amazonservices.de' . "\n";
$sign .= '/Products/2011-10-01' . "\n";
$sign .= $arr;

$signature = hash_hmac("sha256", $sign, $secret, true);
$s64 = base64_encode($signature);

$signature = urlencode($s64);
$link  = "https://mws.amazonservices.de/Products/2011-10-01";
$arr .= "&Signature=" . $signature;

$ch = curl_init($link);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded', 'Accept:'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $arr); 
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo $response;

我使用了 curl_setopt($ch, CURLOPT_VERBOSE, true); 来调试服务器的响应。您的代码没有生成任何要输出的 http 正文,但此 http header HTTP/1.1 405 Method Not Allowed。更改为 POST 解决了您的问题。

关于php - 使用 PHP 的 Amazon MWS API 未显示任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341235/

相关文章:

javascript - Json Api Auth post请求到wordpress后端

java - 使用 java 和 spring 的 AWS SQS 异步查询监听器。如何将环境变量中的值插入@MessageMapping注释

c# - Microsoft azure 服务总线 api - 如何在订阅描述上添加 AutoDeleteOnIdle

python - 如何从 AWS S3 存储桶下载加密的 .gz 文件

amazon-web-services - 由于配置错误 : Authorizer error,AWS 执行失败

php - seo 网址重写

php - 在 PHP 中从 CSV 创建多维关联数组

php - 使用 OpenID 在 CodeIgniter 中使用 Google 帐户登录

php - 将 WordPress 帖子元转换为 PHP 数组

c# - 如何访问连接字符串并连接到数据库