gpt4 book ai didi

c# - 向亚马逊 MWS 服务发布请求

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:01 25 4
gpt4 key购买 nike

我已经在这个问题上浪费了几天...主要问题是——我不知道如何发布数据。我想从获取 OrderReferenceDetails 开始。通过查看 MWS Scratchpad (API 部分:Off Amazon 支付,操作:GetOferenceDetails)。

据我了解,我应该做的第一件事就是计算签名。所以通过使用这个 Amazon developer guide ,并以暂存器中的值为例,我创建了字符串,并从中计算了签名。这个字符串看起来像这样

POST
mws.amazonservices.com
/offamazonpayments_sandbox/2013-01-01
Action=GetOrderReferenceDetails&AmazonOrderReferenceId=[_my order reference id_]&AWSAccessKeyId=[_my access key_]&SellerId=[_my seller id_]&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2014-11-04T12%3a15%3a38.1988397Z&Version=2013-01-01

所以我对它进行哈希处理并得到一个签名,然后我应该将它添加到查询参数行中,例如 &Signature=[_my clalculated signature]

我用来计算签名的函数:

private static String sign(String data, String secretKey)
{
String result = null;
KeyedHashAlgorithm algorithm = new HMACSHA256();
Encoding encoding = new UTF8Encoding();
algorithm.Key = encoding.GetBytes(secretKey);
result = Convert.ToBase64String(algorithm.ComputeHash(encoding.GetBytes(data.ToCharArray())));
return result;
}

问题从这里开始(我认为)。 Scratchpad 提供了要发布的“数据”,但我不明白如何使用它(从 scratchpad 复制粘贴):

POST /OffAmazonPayments_Sandbox/2013-01-01?AWSAccessKeyId=
&Action=GetOrderReferenceDetails
&SellerId=
&SignatureVersion=2
&Timestamp=2014-11-04T12%3A37%3A58Z
&Version=2013-01-01
&Signature=rEqRKP27Pklu%2BAmRLR%2ByRpUtfhNsVOWuGTQ7s%2FgkB2w%3D
&SignatureMethod=HmacSHA256
&AmazonOrderReferenceId= HTTP/1.1
Host: mws.amazonservices.com
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml

这是什么?我熟悉这样的请求:

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "text/xml";
request.Host = "whatever host I need to use";
request.ContentLength = Encoding.UTF8.GetByteCount(dataAsString);
byte[] byteArray = Encoding.UTF8.GetBytes(dataAsString);
using (Stream dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
}
try
{
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
string responseAsString = streamReader.ReadToEnd();
}
}
catch (WebException exception)
{
HttpWebResponse exceptionalResponse = exception.Response as HttpWebResponse;
using (var streamReader = new StreamReader(exceptionalResponse.GetResponseStream()))
{
String responseAsString = streamReader.ReadToEnd();
}
}

问题是:

我是否正确计算了签名?

如何构造web请求?

感谢阅读并尝试提供帮助!

编辑:

好吧,我终于得到了 MWS Amazon 的回应,这不是错误!我为使其工作而执行的步骤:

构造将被手动签名的字符串 - 查询参数的顺序很重要。

构建我将手动发布数据的 url - 同样,顺序很重要,但与之前签名的字符串不同。签名字符串中的键应该使用字典字节顺序进行排序。好吧,我不知道那是什么动物,所以这就是我手工完成所有事情的原因,例如拿便签本。

最佳答案

我为此苦苦挣扎了几天,归结为参数的顺序。我试图找到一种无需手动操作即可对参数进行排序的解决方案,并最终找到了答案。我最初创建了一个 SortedDictionary() 仍然没有用。然后我看到了一个来自 Claytondus nuget 包的例子,它与 MWS 一起工作,他有 SortedDictionary(StringComparer.Ordinal)。一旦我这样做了,它就正确排序并得到了很好的回应。

关于c# - 向亚马逊 MWS 服务发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26735521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com