2015-09-04 68 views
0

我目前正在與亞馬遜MWS通過插件集成一些功能到WordPress。我使用這裏找到亞馬遜提供的客戶端庫:使用亞馬遜MWS(PHP) - 報告請求API函數返回時沒有數據,沒有錯誤拋出

https://developer.amazonservices.com/api.html?group=bde&section=reports&version=latest

這些客戶端庫和示例PHP文件包括我已成立了我的插件,使兩個API調用。首先是requestReport

public function requestInventoryReport() { 
    AWI_Amazon_Config::defineCredentials(); // Defines data for API Call 
    $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); 
    $request = new MarketplaceWebService_Model_RequestReportRequest(); 
    $request->setMerchant(MERCHANT_ID); 
    $request->setReportType('_GET_MERCHANT_LISTINGS_DATA_'); 
    self::invokeRequestReport($service, $request); 
} 

private function invokeRequestReport(MarketplaceWebService_Interface $service, $request) { 
    try { 
     $response = $service->requestReport($request); 
     if ($response->isSetRequestReportResult()) { 
      // Print Out Data 
     } 
    } catch (MarketplaceWebService_Exception $ex) { 
     // Print Out Error 
    } 
} 

,第二個是getReportRequestList其具有類似於第一功能代碼。我能夠無任何錯誤地運行這些功能。我遇到的問題是$response->isSetRequestReportResult()返回false。根據我的理解並查看響應對象,這將表明響應對象沒有結果。 (在打印出響應對象時,我可以看到結果數組的FieldValue爲NULL。)但是,調用不會引發錯誤,但它們都不會產生結果。

我對代碼進行了一些挖掘,發現結果實際上是從api調用返回的,但是當庫嘗試從XML中解析它時,從未將其設置爲返回對象。我已經將錯誤追蹤到這段代碼(這段代碼沒有被我直接從amazon mws報告庫中修改過)。在此功能中的DOM元素節點的開始

private function fromDOMElement(DOMElement $dom) 
{ 
    $xpath = new DOMXPath($dom->ownerDocument); 
    $xpath->registerNamespace('a', 'http://mws.amazonaws.com/doc/2009-01-01/'); 

    foreach ($this->fields as $fieldName => $field) { 
     $fieldType = $field['FieldType']; 
     if (is_array($fieldType)) { 
      if ($this->isComplexType($fieldType[0])) { 
       // Handle Data 
      } else { 
       // Handle Data 
      } 
     } else { 
      if ($this->isComplexType($fieldType)) { 
       // Handle Data 
      } else { 
       $element = $xpath->query("./a:$fieldName/text()", $dom); 
       $data = null; 
       if ($element->length == 1) { 
        switch($this->fields[$fieldName]['FieldType']) { 
         case 'DateTime': 
          $data = new DateTime($element->item(0)->data, 
           new DateTimeZone('UTC')); 
          break; 
         case 'bool': 
          $value = $element->item(0)->data; 
          $data = $value === 'true' ? true : false; 
          break; 
         default: 
          $data = $element->item(0)->data; 
          break; 
        } 
        $this->fields[$fieldName]['FieldValue'] = $data; 
       } 
      } 
     } 
    } 
} 

應該進入RequestReportResult的數據存在。邏輯流程將其轉化爲foreach中的最後一個else語句。該代碼運行其查詢並返回$element,但$element->length = 13在我的情況下,導致它失敗的if語句,並從來沒有將數據設置爲對象。我也研究過$element->item(0)以查看它裏面的內容,它看起來像是一個dom對象,它本身與原始dom對象相匹配,但有一堆空字符串。

現在,我新來MWS的工作,我的直覺是,我缺少一個參數在我的api調用,這是搞亂了數據如何返回,並導致這個奇怪的錯誤,但我'在這一點上沒有任何想法。如果任何人有任何想法或可以指引我正確的方向,我將不勝感激。

謝謝你的時間!

**另外,作爲一個側面說明,亞馬遜便籤不正確使用,我用我的代碼**

回答

0

這些作品對我來說,檢查是否缺少任何相同的參數返回的一切。 對於RequestReportRequest我這樣做:

$request = new MarketplaceWebService_Model_RequestReportRequest(); 
$marketplaceIdArray = array("Id" => array($pos_data['marketplace_id'])); 
$request->setMarketplaceIdList($marketplaceIdArray); 
$request->setMerchant($pos_data['merchant_id']); 
$request->setReportType($this->report_type); 

對於GetReportRequestList我這樣做:

$service = new MarketplaceWebService_Client($pos_data['aws_access_key'], $pos_data['aws_secret_access_key'], $pos_data['config'], $pos_data['application_name'], $pos_data['application_version']); 
$report_request = new MarketplaceWebService_Model_GetReportRequestListRequest(); 
$report_request->setMerchant($pos_data["merchant_id"]); 
$report_type_request = new MarketplaceWebService_Model_TypeList(); 
$report_type_request->setType($this->report_type); 
$report_request->setReportTypeList($report_type_request); 
$report_request_status = $this->invokeGetReportRequestList($service, $report_request, $report_requestID);