在亚马逊 MWS 中更新订单状态后出现“无法履行订单”错误

Posted

技术标签:

【中文标题】在亚马逊 MWS 中更新订单状态后出现“无法履行订单”错误【英文标题】:"Order cannot be fulfilled" error after updating order status in Amazon MWS 【发布时间】:2016-10-03 16:07:23 【问题描述】:

您好,我已经使用 Orders API 列出了我的订单中所有可用的订单, 现在我想通过使用 Feed API 将订单状态更新为 Shipped,在 amazon Scratchpad 我使用 Feed API 来更新产品的状态并且它已成功提交并且然后通过使用 Feed-ID,我检查了提交的 Feed 的状态,状态中没有错误,但有一个名为此的警告。

订单无法完成。如需更多信息,请联系卖家支持

并且订单状态没有更改为已发货。

这是我用来更新状态的 Feed 并且 Feed 类型是 _POST_ORDER_FULFILLMENT_DATA_ 而且我不知道我应该给什么,所以我只是给了一个随机数,我尝试没有这个 MerchantFulfillmentID 但没有用,请帮我解决这个问题,谢谢

<?php
/** 
 *  PHP Version 5
 *
 *  @category    Amazon
 *  @package     MarketplaceWebService
 *  @copyright   Copyright 2009 Amazon Technologies, Inc.
 *  @link        http://aws.amazon.com
 *  @license     http://aws.amazon.com/apache2.0  Apache License, Version 2.0
 *  @version     2009-01-01
 */

/**
 * Submit Feed  Sample
 */

include_once ('.config.inc.php'); 


// India
$serviceUrl = "https://mws.amazonservices.in";

$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);


$ship_date = date("c");

$feed = <<<EOD
<?xml version="1.0"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
 <MerchantIdentifier>***********</MerchantIdentifier>
</Header>
<MessageType>OrderFulfillment</MessageType>
    <Message>
        <MessageID>1</MessageID>
        <OrderFulfillment>
            <AmazonOrderID>111-1111111-1111111</AmazonOrderID>
            <FulfillmentDate>$ship_date</FulfillmentDate>
            <FulfillmentData>
                <CarrierName>Contact Us for Details</CarrierName>
                <ShippingMethod>Standard</ShippingMethod>
            </FulfillmentData>
            <Item>
                <AmazonOrderItemCode>70359459457611</AmazonOrderItemCode>
                <Quantity>1</Quantity>
            </Item>
        </OrderFulfillment>
    </Message>
</AmazonEnvelope>
EOD;


// Constructing the MarketplaceId array which will be passed in as the the MarketplaceIdList 
// parameter to the SubmitFeedRequest object.
$marketplaceIdArray = array("Id" => array('************'));

 // MWS request objects can be constructed two ways: either passing an array containing the 
 // required request parameters into the request constructor, or by individually setting the request
 // parameters via setter methods.
 // Uncomment one of the methods below.

/********* Begin Comment Block *********/

$feedHandle = @fopen('php://temp', 'rw+');
fwrite($feedHandle, $feed);
rewind($feedHandle);
$parameters = array (
  'Merchant' => MERCHANT_ID,
  'MarketplaceIdList' => $marketplaceIdArray,
  'FeedType' => '_POST_ORDER_FULFILLMENT_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);
/********* End Comment Block *********/



invokeSubmitFeed($service, $request);

//@fclose($feedHandle);




  *   
  * @param MarketplaceWebService_Interface $service instance of MarketplaceWebService_Interface
  * @param mixed $request MarketplaceWebService_Model_SubmitFeed or array of parameters
  */
  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");
     
 

编辑了上面的代码。这是我的提交提要 API 中包含的内容。

【问题讨论】:

这是您正在履行的实际订单吗?如果是,请联系卖家支持,他们可以比我们更快地为您提供帮助。 是的,是真正的订单。 但我想将此项目标记为从 API 发货,而不是手动。 【参考方案1】:

我使用以下代码通过 Feeds API 发送订单。

$order_id = str_replace('"', "", $product_list[$i][0]);
$ship_date = date("c");
$carrier_code = str_replace('"', "", $product_list[$i][4]);

///////////////////////////////////////////////////////////////////
//THE FulfillmentDate MUST BE BETWEEN THE ORDER DATE AND NOW
///////////////////////////////////////////////////////////////////

$pre_message .= "<Message>";
$pre_message .= "<MessageID>$i</MessageID>";
$pre_message .= "<OrderFulfillment>";
$pre_message .= "<AmazonOrderID>$order_id</AmazonOrderID>";
$pre_message .= "<FulfillmentDate>$ship_date</FulfillmentDate>";
$pre_message .= "<FulfillmentData>";
$pre_message .= "<CarrierCode>Royal Mail</CarrierCode>";
$pre_message .= "</FulfillmentData>";
$pre_message .= "</OrderFulfillment>";
$pre_message .= "</Message>";

$feed = <<<EOD
<?xml version="1.0"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>$merchant_token</MerchantIdentifier>
</Header>
<MessageType>OrderFulfillment</MessageType>
$pre_message
</AmazonEnvelope>
EOD;

$feed = trim($feed);

$marketplaceIdArray = array("Id" => array($MARKETPLACE_ID));
$feedHandle = @fopen('php://temp', 'rw+');
fwrite($feedHandle, $feed);
rewind($feedHandle); //Sets file pointer at beginning of file

$parameters = array(
    'Merchant' => $MERCHANT_ID,
    'MarketplaceIdList' => $marketplaceIdArray,
    'FeedType' => '_POST_ORDER_FULFILLMENT_DATA_',
    'FeedContent' => $feedHandle,
    'PurgeAndReplace' => false, //Leave this PurgeAndReplace to false so that it want replace whole product in amazon inventory
    'ContentMd5' => base64_encode(md5(stream_get_contents($feedHandle), true))
);

rewind($feedHandle);
$request = new MarketplaceWebService_Model_SubmitFeedRequest($parameters);

$return_feed = invokeSubmitFeed($service, $request);

【讨论】:

嗨,谢谢你的代码,我试着给出你在亚马逊暂存器中给出 XML 的方式,然后同样的警告也来了.. 能否请您发布您的整个代码,以便我检查是否有任何更改。 我已经编辑并在顶部发布了整个代码,请查看。 嗨,萨尔曼,我唯一能想到的是,我不知道你是否声明了 DATE_FORMAT = 'Y-m-d';在配置文件中。如果您按该订单运送所有物品,您也不需要 日期格式是 'Y-m-d\TH:i:s\Z' 对吗?

以上是关于在亚马逊 MWS 中更新订单状态后出现“无法履行订单”错误的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊 MWS 将订单标记为已发货

从哪里获取买家信息,例如买家电子邮件、姓名等待处理订单或在亚马逊 mws 中取消订单

如何通过“亚马逊MWS订单API”获取“非亚马逊”销售渠道订单

亚马逊费用未显示在 MWS 订单 API 上

亚马逊 MWS 提要 API 问题,取消订单

如何使用PHP调用亚马逊MWS订单?