【问题标题】:Trying to upload PDF invoice to Amazon MWS results in Error: "Please provide only one valid marketplace while uploading an invoice"尝试将 PDF 发票上传到亚马逊 MWS 会导致错误:“上传发票时请仅提供一个有效的商城”
【发布时间】: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.demws-eu.amazonservices.com之间似乎没有功能差异
  • 我找到了解决方案并更新了我的代码。解决方案:Marketplace Id 参数名称必须为MarketplaceIdList.Id.1
  • 你能在答案 $amazon_feed is also not defined 中编写工作代码

标签: php curl upload amazon-mws invoice


【解决方案1】:

没有 XML 可与此提要一起发布。 FeedContent (CURLOPT_POSTFIELDS) 是 PDF 的内容 ($pdf_feed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多