我目前正在與亞馬遜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調用,這是搞亂了數據如何返回,並導致這個奇怪的錯誤,但我'在這一點上沒有任何想法。如果任何人有任何想法或可以指引我正確的方向,我將不勝感激。
謝謝你的時間!
**另外,作爲一個側面說明,亞馬遜便籤不正確使用,我用我的代碼**