Amazon MWS-即使签名与scratchpad(Javascript)匹配,仍会出现签名不匹配错误

Amazon MWS-即使签名与scratchpad(Javascript)匹配,仍会出现签名不匹配错误,javascript,node.js,amazon-mws,Javascript,Node.js,Amazon Mws,我正在尝试向/Financials端点发送POST请求,但无法通过显示以下内容的错误: <ErrorResponse xmlns="http://mws.amazonservices.com/schema/Finances/2015-05-01"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message&

我正在尝试向/Financials端点发送POST请求,但无法通过显示以下内容的错误:

<ErrorResponse xmlns="http://mws.amazonservices.com/schema/Finances/2015-05-01">
  <Error>
    <Type>Sender</Type>
    <Code>SignatureDoesNotMatch</Code>
    <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>
  </Error>
</ErrorResponse>
我已经从Scratchpad上成功查询的参数中直接提取出来,并通过哈希过程运行它们,并且正在计算与Scratchpad上计算的参数相匹配的签名,因此我知道我的签名过程是准确的,但即使在这些情况下,我仍然会收到不匹配的签名错误。这告诉我,我的请求可能还有其他问题,但是我尝试了许多不同的变体,并模仿文档,但没有成功

我尝试过按ASCII字母顺序以及scratchpad显示的顺序(不是字母顺序)对参数进行排序,但两者都不起作用。我的任何键或额外空格中都没有拼写错误。我不知道是什么原因导致了这种情况,如果您与mws合作过,我将非常感谢您的帮助。下面是我的代码:

const method = "POST";
const hostName = "mws.amazonservices.com";
const requestUri = "/Finances/2015-05-01";
const keyId = XXXXXXXXXXXX;
const action = "ListFinancialEvents";
const authToken = XXXXXXXXXx;
const sellerId = XXXXXXXXX;
const secretKey = XXXXXXXXXXXx;
const signatureVersion = "2";
const timestamp = new Date();
const formattedTimestamp = timestamp.toISOString();
const version = "2015-05-01";
const signatureMethod = "HmacSHA256";
const postedAfter = "2020-06-07T0:00:00Z";

const queryString =
  "AWSAccessKeyId=" +
  encodeURIComponent(keyId) +
  "&Action=" +
  encodeURIComponent(action) +
  "&MWSAuthToken=" +
  encodeURIComponent(authToken) +
  "&PostedAfter=" +
  encodeURIComponent(postedAfter) +
  "&SellerId=" +
  encodeURIComponent(sellerId) +
  "&SignatureMethod=" +
  encodeURIComponent(signatureMethod) +
  "&SignatureVersion=" +
  encodeURIComponent(signatureVersion) +
  "&Timestamp=" +
  encodeURIComponent(formattedTimestamp) +
  "&Version=" +
  encodeURIComponent(version);

const stringToSign =
  method + "\n" + hostName + "\n" + requestUri + "\n" + queryString;

const signature = crypto
  .createHmac("sha256", secretKey)
  .update(stringToSign)
  .digest("base64");

const queryBody = querystring.stringify({
  AWSAccessKeyId: keyId,
  Action: action,
  MWSAuthToken: authToken,
  PostedAfter: postedAfter,
  SellerId: sellerId,
  SignatureMethod: signatureMethod,
  SignatureVersion: signatureVersion,
  Timestamp: formattedTimestamp,
  Version: version,
  Signature: signature,
});

const options = {
  hostname: hostName,
  path: requestUri,
  method: method,
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": queryBody.length,
    Host: "mws.amazonservices.com",
    "User-Agent": "myMWSApp/1.0 (Language=Javascript)",
  },
};

const req = https.request(options, (res) => {
  console.log("statusCode", res.statusCode);
  console.log("headers:", res.headers);

  res.on("data", (d) => {
    process.stdout.write(d);
  });
});

req.on("error", (e) => {
  console.error("ERROR:", e);
});

req.write(queryBody);
req.end();