我正在尝试实现一种基于内部编写的 PHP 的方式,使用 MWS 将产品上传到我的亚马逊市场。
我浏览了这些示例,并认为鉴于成功的消息和 FeedSubmissionID,我的思路是正确的,但事实并非如此,MWS 告诉您您已成功完成 SubmitFeed,即使您实际上没有完成。
我的问题与当我尝试更新库存时我的 $feed
变量到底应该是什么样子有关。基于亚马逊 MWS 发现 here .
代码
这是 SubmitFeedSample.php
的压缩版本。
我的 AWS_ACCESS_etc.. 位于我的 .config.inc.php 中,该文件在一开始就包含一次。几乎可以肯定这一切都是好的,因为我收到了成功的响应。
include_once ('.config.inc.php');
$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);
$feed = '
<?xml version="1.0" ?>
<AmazonEnvelope xsi:noNamespaceSchemaLocation="amzn-envelope.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>A2EUQ1WTGCTBG2</MerchantIdentifier>
</Header>
<MessageType>Inventory</MessageType>
<Message>
<MessageID>1</MessageID>
<OperationType>Update</OperationType>
<Inventory>
<SKU>424271</SKU>
<Quantity>8</Quantity>
</Inventory>
</Message>
</AmazonEnvelope>
';
$marketplaceIdArray = array("Id" => array('ATVPDKIKX0DER'));
$feedHandle = @fopen('php://temp', 'rw+');
fwrite($feedHandle, $feed);
rewind($feedHandle);
$parameters = array (
'Merchant' => MERCHANT_ID,
'MarketplaceIdList' => $marketplaceIdArray,
'FeedType' => '_POST_INVENTORY_AVAILABILITY_DATA_',
'FeedContent' => $feedHandle,
'PurgeAndReplace' => false,
'ContentMd5' => base64_encode(md5(stream_get_contents($feedHandle), true)),
//'MWSAuthToken' => '<MWS Auth Token>', // Optional
);
rewind($feedHandle);
$request = new MarketplaceWebService_Model_SubmitFeedRequest($parameters);
invokeSubmitFeed($service, $request);
@fclose($feedHandle);
function invokeSubmitFeed(MarketplaceWebService_Interface $service, $request)
{
try {
$response = $service->submitFeed($request);
echo ("Service Response\n");
echo ("=============================================================================\n");
echo(" SubmitFeedResponse\n");
if ($response->isSetSubmitFeedResult()) {
echo(" SubmitFeedResult\n");
$submitFeedResult = $response->getSubmitFeedResult();
if ($submitFeedResult->isSetFeedSubmissionInfo()) {
echo(" FeedSubmissionInfo\n");
$feedSubmissionInfo = $submitFeedResult->getFeedSubmissionInfo();
if ($feedSubmissionInfo->isSetFeedSubmissionId())
{
echo(" FeedSubmissionId\n");
echo(" " . $feedSubmissionInfo->getFeedSubmissionId() . "\n");
}
if ($feedSubmissionInfo->isSetFeedType())
{
echo(" FeedType\n");
echo(" " . $feedSubmissionInfo->getFeedType() . "\n");
}
if ($feedSubmissionInfo->isSetSubmittedDate())
{
echo(" SubmittedDate\n");
echo(" " . $feedSubmissionInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n");
}
if ($feedSubmissionInfo->isSetFeedProcessingStatus())
{
echo(" FeedProcessingStatus\n");
echo(" " . $feedSubmissionInfo->getFeedProcessingStatus() . "\n");
}
if ($feedSubmissionInfo->isSetStartedProcessingDate())
{
echo(" StartedProcessingDate\n");
echo(" " . $feedSubmissionInfo->getStartedProcessingDate()->format(DATE_FORMAT) . "\n");
}
if ($feedSubmissionInfo->isSetCompletedProcessingDate())
{
echo(" CompletedProcessingDate\n");
echo(" " . $feedSubmissionInfo->getCompletedProcessingDate()->format(DATE_FORMAT) . "\n");
}
}
}
if ($response->isSetResponseMetadata()) {
echo(" ResponseMetadata\n");
$responseMetadata = $response->getResponseMetadata();
if ($responseMetadata->isSetRequestId())
{
echo(" RequestId\n");
echo(" " . $responseMetadata->getRequestId() . "\n");
}
}
echo(" ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n");
} catch (MarketplaceWebService_Exception $ex) {
echo("Caught Exception: " . $ex->getMessage() . "\n");
echo("Response Status Code: " . $ex->getStatusCode() . "\n");
echo("Error Code: " . $ex->getErrorCode() . "\n");
echo("Error Type: " . $ex->getErrorType() . "\n");
echo("Request ID: " . $ex->getRequestId() . "\n");
echo("XML: " . $ex->getXML() . "\n");
echo("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n");
}
}
所以我的 $feed 变量就是我有问题的变量。我的目录中有 amzn-envelope.xsd 和其他 .xsd 文件。我做错了什么?
编辑
我发现解决方案实际上是我的 $feed
变量,因为我不需要 \<\?xml version="1.0"\?> 行是我的 Feed 的一部分。
最佳答案
您的 Feed 通过 Amazon XSD 进行验证,这意味着它结构良好,但仍可能包含逻辑错误,例如您的产品列表中没有 SKU 424271。要从 Amazon 返回有关逻辑错误的信息,调用 SubmitFeed
并检查其结果是不够的,因为这仅告诉您 Feed 已被接受并放入处理队列中。您还需要等待该 feed 被处理,并在处理完成后检查处理结果。
how to check the processing state and results of MWS feeds
另请注意,您需要发送多个相互依赖的 Feed。如果其他 Feed 在当前数据之前尚未发送(或处理失败),则 Feed 很容易失败。
关于php - 使用亚马逊 MWS 时我的 Feed 应该是什么样子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592950/