Amazon MWS-即使签名与scratchpad(Javascript)匹配,仍会出现签名不匹配错误
我正在尝试向/Financials端点发送POST请求,但无法通过显示以下内容的错误: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&
<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();