2016-04-26 3 views
0

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

Здесь это код, как я говорю, секрет, торговец, и KeyID правильны:

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-блокнотная перечисляет его как SellerId, но URL показывает, как купец - я попробовал и не радость

ответ

0

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

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

<?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"); 
    } 
} 

EDIT

Вот важные части файла .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... 

EDIT

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

+0

спасибо за это, что вы использовали для имени и версии приложения (я спрашиваю, потому что он по-прежнему терпит неудачу для меня) - также, amazon никогда не назначал marketplace_id - так как я только ищу северную америку - поэтому я прокомментировал это - похоже, что скрипт терпит неудачу в новом вызове MarketplaceWebService_Client (по крайней мере, vardump ничего не показывает) – user1260414

+0

@ user1260414 Только что отредактировал мой самый, включая важные части '.config.inc.php'. – Michael

+0

как только я загрузил весь остальной вздутый код амазонки, он сработал - спасибо за то, что я указал в правильном направлении! – user1260414

Смежные вопросы