【发布时间】:2019-12-04 14:46:31
【问题描述】:
我目前正在尝试弄清楚如何使用 php/curl 将我自己的发票 pdf 文件上传到亚马逊 MWS: 1.) 使用操作将 pdf 上传到亚马逊 MWS:SubmitFeed 和 FeedType:UPLOAD_VAT_INVOICE 这是通过 FeedSubmissionId 给出积极响应
2.) 获取 Feed 提交结果,该 FeedSubmissionId 报告错误 79523“请在上传发票时仅提供一个有效的市场。”
所以我假设我的上传工作不正常,但我找不到错误。
亚马逊的这个 PDF 文件的第 21 页描述了错误代码:VAT Calculation Service (VCS) Developer Guide
到目前为止,我已经花了 2 天的时间试图解决这个问题,但我在谷歌上找不到任何关于它的信息。希望这里有人可以帮助我。谢谢!
代码如下:
<?php
$param = array();
$param['AWSAccessKeyId'] = 'XXXXX';
$param['Action'] = 'SubmitFeed';
$param['Merchant'] = 'XXXXX';
$param['FeedType'] = '_UPLOAD_VAT_INVOICE_';//'_POST_ORDER_FULFILLMENT_DATA_';
$param['FeedOptions'] = 'metadata:OrderId='.$amz_order_id.';metadata:TotalAmount='.$TotalAmount.';metadata:TotalVATAmount='.$TotalVATAmount.';metadata:InvoiceNumber='.$InvoiceNumber.';metadata:documenttype=Invoice';
$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['MarketplaceIdList.Id.1'] = 'A1PA6795UKMFR9';
$param['PurgeAndReplace'] = 'false';
$secret = 'XXXXX';
$url = array();
foreach ($param as $key => $val) {
$key = str_replace("%7E", "~", rawurlencode($key));
$val = str_replace("%7E", "~", rawurlencode($val));
$url[] = "{$key}={$val}";
}
sort($url);
$file = fopen($link_to_pdf_file,"r");
$pdf_feed=fread($file,filesize($FileName));
fclose($file);
$amazon_feed='<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>'.$param['Merchant'].'</MerchantIdentifier>
</Header>
<MessageType>OrderFulfillment</MessageType>
<Message>
<MessageID>'.getserial().'</MessageID>
<OrderFulfillment>
<AmazonOrderID>'.$amz_order_id.'</AmazonOrderID>
<FulfillmentDate>'.$param['Timestamp'].'</FulfillmentDate>
<FulfillmentData>
<CarrierName>Deutsche Post</CarrierName>
<ShippingMethod>Brief</ShippingMethod>
<ShipperTrackingNumber></ShipperTrackingNumber>
</FulfillmentData>
</OrderFulfillment>
</Message>
</AmazonEnvelope>';
$arr = implode('&', $url);
$sign = 'POST' . "\n";
$sign .= 'mws.amazonservices.de' . "\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/octet-stream';//application/pdf
$httpHeader[] = 'Content-MD5: ' . base64_encode(md5($pdf_feed, true));
$httpHeader[] = 'Expect:';
$httpHeader[] = 'Accept:';
$signature = urlencode(base64_encode($signature));
$link = "https://mws.amazonservices.de/Feeds/".$param['Version']."?";
$link .= $arr . "&Signature=" . $signature;
$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['reply'] = curl_exec($ch);
$response['info'] = curl_getinfo($ch);
curl_close($ch);
?>
【问题讨论】:
-
您是否发布到正确的端点?您的市场 ID 表示使用 mws-eu 端点的德国:docs.developer.amazonservices.com/en_US/dev_guide/… 另外我希望参数名称应该是单数,
MarketplaceId,因为MarketplaceIdList表示多个。 -
我已经尝试了几个端点,“mws.amazonservices.de”正在工作。对于参数“MarketplaceId”,我尝试了所有可以在网上找到的不同格式:
'Marketplace', 'MarketplaceId', 'MarketplaceList.Id', 'MarketplaceId.Id.1',这似乎没有任何区别 -
端点
mws.amazonservices.de和mws-eu.amazonservices.com之间似乎没有功能差异 -
我找到了解决方案并更新了我的代码。解决方案:Marketplace Id 参数名称必须为
MarketplaceIdList.Id.1 -
你能在答案 $amazon_feed is also not defined 中编写工作代码
标签: php curl upload amazon-mws invoice