php - 使用亚马逊 MWS 时我的 Feed 应该是什么样子?

标签 php xml amazon-web-services xsd amazon-mws

我正在尝试实现一种基于内部编写的 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 很容易失败。

sending multiple dependent MWS feeds to update products

关于php - 使用亚马逊 MWS 时我的 Feed 应该是什么样子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28592950/

相关文章:

php - SELECT WHERE 变量不起作用

php - 填充数组php的算法

xml - 使用 XPath 查询同名元素

xml - 提高将行附加到 data.table 的性能

java - 在隐藏字段的 HTML 值中编码/加密 XML。

mysql - 无法从 EC2 实例连接到 RDS 实例

PHP:全局变量替代品?

php - 可视化来自 mySQL 数据库的数据并将其显示在 html 上?

ubuntu - 从 Amazon S3 下载文件的速度下降到 <2 kb/s = 下载速度非常慢(在上传文件的机器上)

amazon-web-services - 具有固定 IP 的 AWS 客户端 VPN