[英]Amazon MWS (PHP) - Report Request API functions return without data, no error thrown
我目前正在与亚马逊MWS合作,以通过插件将某些功能集成到wordpress中。 我正在使用由Amazon提供的客户端库,可在此处找到:
https://developer.amazonservices.com/api.html?group=bde§ion=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报告库中获取了该代码)。
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会使用我在代码中使用的相同参数来正确返回所有内容**
这些对我有用,请检查您是否缺少任何东西。 对于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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.