亚马逊 MWS API 与 R 的集成:SignatureDoesNotMatch

时间:2020-12-22 18:13:08

标签: r amazon-mws

使用此代码(出于安全问题,我已删除 ID 和密钥 - 它们已正确输入)。我不确定出了什么问题。请帮忙。

我正在使用 R 并尝试调用 RequestReport API (http://docs.developer.amazonservices.com/en_US/reports/Reports_RequestReport.html)。所以请仅在 R 脚本中提出解决方案。

base.html.string <- "https://mws.amazonservices.com/Reports/2009-01-01?"
SellerID <- 'xxxxxxxx'
MarketplaceID <- 'xxxxxxxxxxxxxx'
AWSAccessKeyId <- 'xxxxxxxxxxxxxxxx'
AWSsecretkey <- 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
ActionType <- 'RequestReport'
version.request <- '2009-01-01'
ReportType <- '_GET_FLAT_FILE_ACTIONABLE_ORDER_DATA_'
pb.txt <- Sys.time()
pb.date <- as.POSIXct(pb.txt, tz = Sys.timezone)
Timestamp <- strtrim(format(pb.date, tz = "GMT", usetz = FALSE, "%Y-%m-%dT%H:%M:%SZ"), 24)
str = paste('POST\nmws.amazonservices.com\n/\n',
            'AWSAccessKeyId=', AWSAccessKeyId,
            '&Action=', ActionType,
            '&Merchant=', SellerID,
            '&ReportType=', ReportType,
            '&SignatureMethod=HmacSHA256',
            '&SignatureVersion=2',
            '&Timestamp=', gsub('%2E','.',gsub('%2D', '-', curlEscape(Timestamp))),
            '&Version=', version.request,
            sep = '')
Signature <- curlEscape(base64(hmac(enc2utf8(AWSsecretkey), enc2utf8(str), algo = 'sha256', serialize = FALSE,  raw = TRUE)))
AmazonURL <- paste(base.html.string,
                   'AWSAccessKeyId=', AWSAccessKeyId,
                   '&Action=', ActionType,
                   '&Merchant=', SellerID,
                   '&SignatureVersion=2',
                   '&Timestamp=', gsub('%2E','.',gsub('%2D', '-', curlEscape(Timestamp))),
                   '&Version=', version.request,
                   '&Signature=', Signature,
                   '&SignatureMethod=HmacSHA256',
                   '&ReportType=', ReportType, 
                   sep = '')
AmazonResult <- getURL(AmazonURL)
AmazonResult

这是我得到的回复

<?xml version=\"1.0\"?>\n<ErrorResponse xmlns=\"http://mws.amazonaws.com/doc/2009-01-01/\">\n  <Error>\n    <Type>Sender</Type>\n    <Code>SignatureDoesNotMatch</Code>\n    <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.</Message>\n  </Error>\n  <RequestID>fa1f2abf-3acf-435b-b98d-7377e778f53c</RequestID>\n</ErrorResponse>\n

1 个答案:

答案 0 :(得分:0)

解决了。菜鸟失误。我使用了 getURL(url) 而不是 POST(url)。

其次,base.html.string 是“https://mws.amazonservices.com/?”而不是“https://mws.amazonservices.com/Reports/2009-01-01?”