Amazon MWS API возвращает SignatureDoesNotMatch

Мне нужно вызвать действие Amazon MWS «RequestReport» и указать тип отчета «_GET_FLAT_FILE_OPEN_LISTINGS_DATA_». Я успешно подключился, чтобы получить FulfillmentInventory / ListInventorySupply, поэтому я знаю, что настройки cURL и amazon верны, но каждый раз, когда я отправляю, я получаю ‘Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой секретный ключ доступа AWS и метод подписи. Обратитесь к сервисной документации для деталей. обратно с сервера. я попробовал и sort, и ksort в строке 23 и 14 — при вызове FulfillmentInventory / ListInventorySupply мне пришлось настроить его на два ksorts, чтобы список SKU оставался в правильном порядке для API.

Вот код, как я уже сказал, правильный секрет, продавец и ключ:

header('Content-type: application/xml');
$secret = 'secretcodehere';

$param = array();
$param['AWSAccessKeyId']   = 'accessidhere';
$param['Action']           = 'RequestReport';
$param['Merchant']         = 'merchantidhere';
$param['SignatureVersion'] = '2';
$param['Timestamp']        = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time());

$param['Version']          = '2009-01-01';
$param['SignatureMethod']  = 'HmacSHA256';
$param['ReportType']  = '_GET_FLAT_FILE_OPEN_LISTINGS_DATA_';
ksort($param);
$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.com';
$sign .= '/doc/2009-01-01' . "\n";
$sign .= $arr;

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

$link  = "https://mws.amazonservices.com/doc/2009-01-01/?";
$link .= $arr . "&Signature=" . $signature;
/*

echo($link);//for debugging

exit(); */

$ch = curl_init($link);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: text/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);
print_r($response);

я пробовал это в блокноте MWS, и информация верна и генерирует ответ 200, и когда я проверяю URL-адрес с тем, который генерируется блокнотом, он «выглядит» правильно, поэтому я должен что-то упустить, и я надеюсь, что это очевидно кто-то там, потому что я сбит с толку.

btw-scratchpad перечисляет это как SellerId, но URL показывает это как Merchant — я пробовал оба без радости

0

Решение

Не для того, чтобы бросить в тебя изогнутый шар, но единственный успех, который у меня был в использовании RequestReport прошел через использование библиотеки PHP, которую создал Amazon. Если у вас его уже нет, вот ссылка на сайт.

Это код, который я только что подтвердил, работает для запроса отчета:

<?php

define('AWS_ACCESS_KEY_ID', $am_aws_access_key);
define('AWS_SECRET_ACCESS_KEY', $am_secret_key);
define('MERCHANT_ID', $am_merchant_id);
define('MARKETPLACE_ID', $am_marketplace_id);

include_once ('/link/to/Amazon/library/MarketplaceWebService/Samples/.config.inc.php');

include_once ('functions.php');

$serviceUrl = "https://mws.amazonservices.com";
$config = array (
'ServiceURL' => $serviceUrl,
'ProxyHost' => null,
'ProxyPort' => -1,
'MaxErrorRetry' => 3,
);
$service = new MarketplaceWebService_Client(
AWS_ACCESS_KEY_ID,
AWS_SECRET_ACCESS_KEY,
$config,
APPLICATION_NAME,
APPLICATION_VERSION);

echo '<br />';
$parameters = array (
'Marketplace' => MARKETPLACE_ID,
'Merchant' => MERCHANT_ID,
'ReportType' => '_GET_FLAT_FILE_OPEN_LISTINGS_DATA_',
);

echo '<br /><br/>Request Report Request:<br><br>';
$request = new MarketplaceWebService_Model_RequestReportRequest($parameters);
print_r($request);
invokeRequestReport($service, $request);
echo '<br /><br/>';

И functions.php файл (в основном это важная функция в последней половине кода в MarketplaceWebService\Samples\RequestReportSample.php файл:

function invokeRequestReport(MarketplaceWebService_Interface $service, $request)
{
try {
$response = $service->requestReport($request);
echo ("Service Response\n");
echo ("=============================================================================\n");
echo("        RequestReportResponse\n");
if ($response->isSetRequestReportResult()) {
echo("            RequestReportResult\n");
$requestReportResult = $response->getRequestReportResult();
if ($requestReportResult->isSetReportRequestInfo()) {
$reportRequestInfo = $requestReportResult->getReportRequestInfo();
echo("                ReportRequestInfo\n");
if ($reportRequestInfo->isSetReportRequestId())
{
echo("                    ReportRequestId\n");
echo("                        " . $reportRequestInfo->getReportRequestId() . "\n");
}
$report_request_id = $reportRequestInfo->getReportRequestId();
$report_type = '';
if ($reportRequestInfo->isSetReportType())
{
echo("                    ReportType\n");
echo("                        " . $reportRequestInfo->getReportType() . "\n");
$report_type = $reportRequestInfo->getReportType();
}
if ($reportRequestInfo->isSetStartDate())
{
echo("                    StartDate\n");
echo("                        " . $reportRequestInfo->getStartDate()->format(DATE_FORMAT) . "\n");
}
if ($reportRequestInfo->isSetEndDate())
{
echo("                    EndDate\n");
echo("                        " . $reportRequestInfo->getEndDate()->format(DATE_FORMAT) . "\n");
}
if ($reportRequestInfo->isSetSubmittedDate())
{
echo("                    SubmittedDate\n");
echo("                        " . $reportRequestInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n");
}
if ($reportRequestInfo->isSetReportProcessingStatus())
{
echo("                    ReportProcessingStatus\n");
echo("                        " . $reportRequestInfo->getReportProcessingStatus() . "\n");
}
if($report_type == '_GET_FLAT_FILE_OPEN_LISTINGS_DATA_') {
if(!empty($report_request_id)) {
$parameters = array (
'Marketplace' => MARKETPLACE_ID,
'Merchant' => MERCHANT_ID,
'Report' => @fopen('php://memory', 'rw+'),
'ReportRequestIdList' => $report_request_id,
);
$report = new MarketplaceWebService_Model_GetReportRequestListRequest($parameters);
print_r($report);
}
}
}
}
if ($response->isSetResponseMetadata()) {
echo("            ResponseMetadata\n");
$responseMetadata = $response->getResponseMetadata();
if ($responseMetadata->isSetRequestId())
{
echo("                RequestId\n");
echo("                    " . $responseMetadata->getRequestId() . "\n");
}
}
} catch (MarketplaceWebService_Exception $ex) {
echo("Caught Exception: " . $ex->getMessage() . "\n");
echo("Response Status Code: " . $ex->getStatusCode() . "\n");
echo("Error Code: " . $ex->getErrorCode() . "\n");
echo("Error Type: " . $ex->getErrorType() . "\n");
echo("Request ID: " . $ex->getRequestId() . "\n");
echo("XML: " . $ex->getXML() . "\n");
}
}

РЕДАКТИРОВАТЬ

Вот важные части .config.inc.php файл:

<?php

define ('DATE_FORMAT', 'Y-m-d\TH:i:s\Z');
date_default_timezone_set('America/Denver');

$app_name = "Just make up a name like 'Awesome Sync'";
$app_version = "1.0";
define('APPLICATION_NAME', $app_name);
define('APPLICATION_VERSION', $app_version);

set_include_path('/link/to/Amazon/library/');
...rest of code...

РЕДАКТИРОВАТЬ

Этот код создаст запрос для отчета, однако на самом деле он не создает отчет. Вы должны продолжать опрашивать Amazon, используя этот же код, пока не получите «Complete» или что-то подобное (не могу вспомнить точное слово, которое Amazon отправляла обратно, когда был создан отчет). Затем вам нужно получить отчет.

0

Другие решения

Других решений пока нет …