【问题标题】:Amazon MWS (PHP) - Report Request API functions return without data, no error thrown亚马逊 MWS (PHP) - 报告请求 API 函数返回没有数据,没有抛出错误
【发布时间】:2015-12-01 04:37:06
【问题描述】:

我目前正在与亚马逊 MWS 合作,通过插件将一些功能集成到 wordpress 中。我正在使用亚马逊提供的客户端库:

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 解析它时,它从未设置为返回对象。我已将错误跟踪到此代码块(此代码未被我触及,直接来自亚马逊 mws 报告库)。

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的数据作为dom元素中的一个节点存在于这个函数的开头。逻辑流将其带入 foreach 中的最后一个 else 语句。代码运行它的查询并返回$element 但是在我的情况下$element->length = 13 导致它使 if 语句失败并且永远不会将数据设置为对象。我还查看了$element->item(0) 以查看其中的内容,它似乎是一个与原始 dom 对象匹配但带有一堆空字符串的 dom 对象。

现在,我是使用 MWS 的新手,我的直觉是我在我的 api 调用中的某处缺少一个参数,它弄乱了数据的返回方式并导致了这个奇怪的错误,但我在这一点上没有想法。如果有人有任何想法或可以指出我正确的方向,我将不胜感激。

感谢您的宝贵时间!

** 另外作为旁注,Amazon Scratchpad 确实使用我在代码中使用的相同参数正确返回所有内容**

【问题讨论】:

    标签: php api amazon amazon-mws


    【解决方案1】:

    这些对我有用,请检查您是否缺少任何东西。 对于 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多