我目前正在与亚马逊MWS通过插件集成一些功能到WordPress。我使用这里找到亚马逊提供的客户端库:使用亚马逊MWS(PHP) - 报告请求API函数返回时没有数据,没有错误抛出
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报告库中修改过)。在此功能中的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调用,这是搞乱了数据如何返回,并导致这个奇怪的错误,但我'在这一点上没有任何想法。如果任何人有任何想法或可以指引我正确的方向,我将不胜感激。
谢谢你的时间!
**另外,作为一个侧面说明,亚马逊便签不正确使用,我用我的代码**