2015-09-04 70 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);