亚马逊 MWS API 使用 PHP 显示无结果

Amazon MWS API using PHP shows no Result

我一直在使用 amazon mws API 开发一个项目来寻找最低价格的报价,它与 ListMatchingProducts 和 GetMatchingProduct 动作配合得很好,但是当涉及到 GetLowestPricedOffersForASIN 时,它在 [=28= 中没有显示任何结果]输出

"This XML file does not appear to have any style information associated with it. The document tree is shown below."

我的 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 body,但是这个 http header HTTP/1.1 405 Method Not Allowed。更改为 POST 解决了您的问题。