当前位置: 首页 > 知识库问答 >
问题:

C#Amazon SP API CreateFeedDocument不工作

南宫兴德
2023-03-14

通过Amazon SP API上传提要有3个步骤,第一个步骤是通过createFeedDocumentAPI获取提要加密信息。但我收到了错误请求作为以下内容的响应:

{
  "errors": [
    {
      "code": "InvalidInput",
      "message": "Invalid Input",
      "details": ""
    }
  ]
}

C#代码

        private async Task<IRestResponse> CreateFeedDocument()
        {
            IRestRequest restRequest = new RestRequest("feeds/2020-09-04/documents", Method.POST);
            restRequest.AddParameter("contentType", "application/xml; charset=UTF-8", ParameterType.RequestBody);
            restRequest.AddQueryParameter("MarketplaceIds", "A21TJRUUN4KGV");
            restClient = new RestClient(live_url_base);
            restRequest = await signRequest(restRequest, restClient);
            return restClient.Execute(restRequest);
        }

        private async Task<IRestRequest> signRequest(IRestRequest restRequest, RestClient restClient)
        {
            var roleAcccess = await GetAssumeRoleTokenDetail();
            restRequest.AddHeader("x-amz-access-token", accessToken);

            AWSAuthenticationCredentials AWSCredentials = new AWSAuthenticationCredentials();
            AWSCredentials.AccessKeyId = roleAcccess.Credentials.AccessKeyId;
            AWSCredentials.SecretKey = roleAcccess.Credentials.SecretAccessKey;
            AWSCredentials.Region = region;

            restRequest.AddHeader("X-Amz-Security-Token", roleAcccess.Credentials.SessionToken);
            return new AWSSigV4Signer(AWSCredentials).Sign(restRequest, restClient.BaseUrl.Host);
        }

我怀疑我没有正确使用restRequest.AddParameter,但我不确定。

我一直在以下链接:
https://github.com/amzn/selling-partner-api-docs/blob/main/references/feeds-api/feeds_2020-09-04.md#createfeeddocument

https://github.com/amzn/selling-partner-api-docs/blob/main/guides/en-US/use-case-guides/feeds-api-use-case-guide/feeds-api-use-case-guide-2020-09-04.md#step-1-create-a-feed-document

如何使用.net在Amzon中使用销售合作伙伴api加密和上载数据

更新我还尝试替换下面的行
restRequest.AddParameter(“contentType”,“application/xml;charset=UTF-8”,ParameterType.RequestBody) 进行编码

但后来我得到了InvalidSignature错误,如下所示:

{
  "errors": [
    {
      "message": "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

The Canonical String for this request should have been
'POST
/feeds/2020-09-04/documents

host:sellingpartnerapi-eu.amazon.com
x-amz-access-token:Atza|IwEBIA5KgrCsBbSXHmrXFS_FIgBTInh_xPAydLfi5q2P9xaFQf7p8Zl4NjqhHHxqRzUku__Q7GN1p2WQGRzuAoAa8oMkPLx57NJ05SqxEVXXG-fet3_XgKj8uBCU30HaGPsKltf4g2MD8Pqqt2OUrOXtkv4dAAjjCIxC-bFwVqOhvHktAur--NBv-bJaPZ608Av1GEu96GsNEV9eb0saVBwLaZD7NW3oOjzlCc8GPV9hdqHV5TUXY77QZgBLD1y94Vs1fSo54ShpyoMMOZebzbSr1K5gtf3wJZ.........................{ I hid it }...........................................
x-amz-date:20210524T175148Z
x-amz-security-token:FwoGZXIvYXdzEGsaDNUytY0xuP5/u61APiK2ARMZgv4IT+y2HLzdg5FjZOv6aL2bJ3baJPxBtCY2/7ASntTXfAF5s39P3/qspLLQfmqHPZiMGjweCE3Yf3aW5Q1mt+FLT2s2VUwuOawOQwDll51T2HB3wqyaDOSEpsWeR2Iym4TJXE2hbo7q5CQQBXissOo1Oruk5gcAp7uQHpnyuhCRCkfv/ErEpzdDA0JqfhMxdzmViVgsL1Kzalnbcy9lp+ACI4TL70iOl6j6xkyhFexe/aLXKLLPr4UGMi3Ver2CL6Q4kz.........................{ I hid it }...........................................

host;x-amz-access-token;x-amz-date;x-amz-security-token
4d719849acd655844ab5129f5e54a0ed16954c9580c7a9a737504faf42b309e2'

The String-to-Sign should have been
'AWS4-HMAC-SHA256
20210524T175148Z
20210524/eu-west-1/execute-api/aws4_request
a20e7ffe252dbf98d6a4b9213511ac1918f8bbad75ccbfd7ec46f5c9c1457b08'
",
     "code": "InvalidSignature"
    }
  ]
}

注意:我已经移除了一些代币的尾随字符并放置了……{I hide it}。。。。。。。。。。


共有2个答案

祁和通
2023-03-14

我在我的开源库和它的工作中做到了这一点

https://github.com/abuzuhri/Amazon-SP-API-CSharp

这里是创建和提交提要的示例

 ConstructFeedService createDocument = new ConstructFeedService("A3J37AJU4O9RHK", "1.02");

        var list = new List<PriceMessage>();
        list.Add(new PriceMessage()
        {
            SKU = "8201031206122...",
            StandardPrice = new StandardPrice()
            {
                currency = BaseCurrencyCode.AED.ToString(),
                Value = (201.0522M).ToString("0.00")
            }
        });
        createDocument.AddPriceMessage(list);

        var xml = createDocument.GetXML();

        var feedID = amazonConnection.Feed.SubmitFeed(xml, FeedType.POST_PRODUCT_PRICING_DATA);

        Thread.Sleep(1000*30);

        var feedOutput=amazonConnection.Feed.GetFeed(feedID);

        var outPut=amazonConnection.Feed.GetFeedDocument(feedOutput.ResultFeedDocumentId);

        var reportOutpit = outPut.Url;
聂风史
2023-03-14

试试这个吧

restRequest.AddJsonBody("{\"contentType\":\"text/tab-separated-values; charset=UTF-8\"}");

RestClient restClient = new RestClient("https://sandbox.sellingpartnerapi-eu.amazon.com/");

IRestRequest restRequest = new RestRequest("/feeds/2021-06-30/documents", Method.POST);

restRequest.AddJsonBody("{\"contentType\":\"text/tab-separated-values; charset=UTF-8\"}");
 类似资料:
  • 我有以下代码,但它只是创建一个0KB的空文件。 我知道数据已成功加载到中,因为如果do而不是行,它将正确导出文件。 我做错了什么?

  • 我试图通过在命令提示符上放置以下行来调用一个可执行文件。(我知道我可以直接调用exe,但我们只能说,由于某些限制,我没有其他方法可以这样做) 给我错误 知道为什么吗?我该如何解决这个问题呢?我必须使用cmd.exe的完整路径。

  • 我有一个简单的测试,我试图将一个弱ptr参数绑定到一个接受弱ptr的全局函数,并在支持指针仍然有效的情况下调用一个方法。 当我用弱指针创建lambda时,这似乎是有效的。如果我用weak_ptr直接调用全局方法,它也可以工作。但是,如果我事先将全局函数绑定到weak_ptr,它似乎不起作用。下面的淡化代码说明了这个问题。 我一定错过了一些简单的东西。有什么线索吗? 结果输出: 期望第一个weakP

  • 问题内容: 考虑以下 jstl 选择: AuthMsgBean = Bean rw =地图 ‘2’=键 题: 当我简单地显示值时,它会显示正常(true),但是一旦我尝试将值解析为when标记,就好像测试始终为false一样。 如果我在测试()中输入true,则显示“显示文本”。 可能是在表达式之前对标记求值了吗? 如果是这样,是否有解决方法? 问题答案: JSTL和JSF不会像您期望的那样同步运

  • 我在写一个函数,需要返回多个变量,其中一个是位集。然后我遇到了一些奇怪的编译错误。 我尝试了不同的编译器,它们都会产生错误,尽管消息不同。 我试着googling了一下,似乎和公共和私有继承有关。但我认为它不应该以任何方式影响这段代码。 简化代码(C 17)如下所示: 如果我移除方括号(即移除结构化绑定并使用普通自动),它就会工作。 错误消息如下: source.cpp:在函数int main()

  • 我正在测试一个网站,以了解如何在C#中使用硒。我无法找到登录表单元素,因为表单输入元素没有任何标识符,而且xpath在我的代码中不起作用。 我包括了一张inspect元素代码的照片,我在检查相关的登录表单元素时看到了该代码。我的代码如下。 当然,我为密码包含的xpath是一个占位符,但它应该看起来与用户名相似。 在使用chrome的copy复制xpath时 我已经找了几个小时的答案,但什么都找不到