向亚马逊MWS服务发布请求

时间:2014-11-04 12:46:46

标签: c# amazon-web-services amazon-mws

我已经在这个问题上浪费了几天...... 主要问题是 - 我不知道如何POST数据。 我想从获取OrderReferenceDetails开始。 通过查看MWS Scratchpad(API部分:亚马逊付款,操作: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提供“数据”发布,但我不明白,如何使用它(从暂存器复制粘贴):

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亚马逊的回复,这不是错误! 我做的步骤使它工作:

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

构建url,我将手动发布数据 - 再次,顺序很重要,但与之前签名的字符串不同。应使用字典字节顺序对带符号字符串中的键进行排序。好吧,我不知道那种动物是什么,所以这就是为什么我用手做了所有事情,例如用便笺。

1 个答案:

答案 0 :(得分:1)

我为此苦苦挣扎了几天,然后归结为参数的顺序。我试图找到一种无需手动进行参数排序的解决方案,最后找到了答案。我最初创建SortedDictionary()仍然无法正常工作。然后,我看到了Claytondus nuget包中与MWS一起使用的示例,他有SortedDictionary(StringComparer.Ordinal)。一旦完成,它就会正确排序并得到良好的响应。