Amazon MWS PHP将订单标记为已发货-在变量中使用XML提交订单履行


Amazon MWS PHP Mark order as Shipped - Submit Order Fulfillment with Shipping with XML in variable

如何使用XML提要标记在Amazon MWS中发货的订单-使用正确的端点、服务、版本和标题

这就是问题所在,我花了3天时间来管理它,因为amazonapi非常混乱,文档是中世纪的,而且最关键的信息,如提交任何特定信息的正确端点地址,都是一个谜。我只能通过模仿scratchpad上的请求,随机测试部分,结合其他请求的示例来创建它,以获得完全不同的部分和操作。提交XML提要是当前管理订单的唯一方法。

所以,这可能会对某人有所帮助。

我能够使以下简单的代码工作:

                        $param = array();
                        $param['AWSAccessKeyId']   = 'YOURKEY'; 
                        $param['Action']           = 'SubmitFeed'; 
                        $param['Merchant']         = 'YOURMERCHANTID'; 
                        $param['FeedType']         = '_POST_ORDER_FULFILLMENT_DATA_'; 
                        $param['SignatureMethod']  = 'HmacSHA256';  
                        $param['SignatureVersion'] = '2'; 
                        $param['Timestamp']        = gmdate("Y-m-d'TH:i:s.''0''0''0''Z", time());
                        $param['Version']          = '2009-01-01'; 
                        $param['MarketplaceId.Id.1']    = 'MARKETPLACEID';
                        $param['PurgeAndReplace']    = 'false';
                        $secret = 'YOURSECRETKEY';
                        $url = array();
                        foreach ($param as $key => $val) {
                            $key = str_replace("%7E", "~", rawurlencode($key));
                            $val = str_replace("%7E", "~", rawurlencode($val));
                            $url[] = "{$key}={$val}";
                        }
                        $amazon_feed='<?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>YOURMERCHANTID</MerchantIdentifier>
                            </Header>
                            <MessageType>OrderFulfillment</MessageType>
                            <Message>
                            <MessageID>1</MessageID>
                            <OrderFulfillment>
                            <AmazonOrderID>YOUROWNORDERIDHERE</AmazonOrderID>
                            <FulfillmentDate>'.$param['Timestamp'].'</FulfillmentDate>
                            <FulfillmentData>
                            <CarrierName>TRACKINGCONAMEHERE</CarrierName>
                            <ShippingMethod>TRACKINGCONAMEORMETHODHERE</ShippingMethod>
                            <ShipperTrackingNumber>TRACKINGNOHERE</ShipperTrackingNumber>
                            </FulfillmentData>
                            </OrderFulfillment>
                            </Message>
                            </AmazonEnvelope>';

                        sort($url);
                        $arr   = implode('&', $url);
                        $sign  = 'POST' . "'n";
                        $sign .= 'mws.amazonservices.com' . "'n";
                        $sign .= '/Feeds/'.$param['Version'].'' . "'n";
                        $sign .= $arr;
                        $signature = hash_hmac("sha256", $sign, $secret, true);
                        $httpHeader     =   array();
                        $httpHeader[]   =   'Transfer-Encoding: chunked';
                        $httpHeader[]   =   'Content-Type: application/xml';
                        $httpHeader[]   =   'Content-MD5: ' . base64_encode(md5($amazon_feed, true));
                        $httpHeader[]   =   'Expect:';
                        $httpHeader[]   =   'Accept:';              
                        $signature = urlencode(base64_encode($signature));
                        $link  = "https://mws.amazonservices.com/Feeds/".$param['Version']."?";
                        $link .= $arr . "&Signature=" . $signature;
                        echo '<br>';
                        echo($link); //for debugging - you can paste this into a browser and see if it loads.
                        echo '<br>';
                        $ch = curl_init($link);
                        curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
                        curl_setopt($ch, CURLOPT_POST, 1); 
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $amazon_feed); 
                        $response = curl_exec($ch);
                        $info = curl_getinfo($ch);
                        curl_close($ch);

给出以下输出:

<?xml version="1.0"?><SubmitFeedResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/">SubmitFeedResult>FeedSubmissionInfo>FeedSubmissionId>XXXXXXXXXXXXXXXXXXX</FeedSubmissionId><FeedType>_POST_ORDER_FULFILLMENT_DATA_</FeedType><SubmittedDate>2014-09-09T00:36:29+00:00</SubmittedDate><FeedProcessingStatus>_SUBMITTED_</FeedProcessingStatus></FeedSubmissionInfo>/SubmitFeedResult>ResponseMetadata>RequestId>XXXXXXXXXXXXXXXXXXX</RequestId></ResponseMetadata></SubmitFeedResponse><?xml version="1.0"?><SubmitFeedResponse xmlns="http://mws.amazonaws.com/doc/2009-01-01/"><SubmitFeedResult><FeedSubmissionInfo><FeedSubmissionId>XXXXXXXXXXXXXXXXXXX</FeedSubmissionId>FeedType>_POST_ORDER_FULFILLMENT_DATA_</FeedType><SubmittedDate>2014-09-09T00:36:29+00:00</SubmittedDate>FeedProcessingStatus>_SUBMITTED_</FeedProcessingStatus></FeedSubmissionInfo>/SubmitFeedResult>ResponseMetadata>RequestId>XXXXXXXXXXXXXXXXXXX</RequestId></ResponseMetadata></SubmitFeedResponse>