如何为Amazon SP-API GET请求添加并哈希HTTP body(C#版,如RDT接口)
亚马逊销售伙伴API(SP-API)获取RDT签名不匹配问题修复方案
问题背景
尝试调用亚马逊SP-API的Token接口获取受限数据令牌(RDT)时遇到签名不匹配报错,原有程序可以正常调用Orders接口的GET请求,这类请求仅包含请求头和URL参数,但Token接口需要在HTTP body中传入受限资源列表,调用时返回如下错误:
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.The Canonical String for this request should have been
'GET
/tokens/2021-03-01/restrictedDataToken
...
host;x-amz-access-token;x-amz-date\n
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
...
报错中返回的e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855是空字符串的SHA256哈希值,说明亚马逊侧计算时认为请求body为空,和本地带body计算的哈希值不一致,导致签名校验失败。
核心问题点
- RDT接口要求使用POST方法,原有代码误用GET方法,GET请求携带的body会被亚马逊直接忽略,视为空body。
- JSON body序列化逻辑错误,导致实际发送的body内容和参与哈希计算的body内容不一致。
- 签名时未将
content-type请求头加入签名头列表,不符合AWS签名规范。
修复步骤
- 修改请求方法为POST,删除QueryString参数移入请求body
// 原错误写法 // IRestRequest restRequest = new RestRequest(rdt_resource, Method.GET); // restRequest.AddParameter("MarketplaceIds", marketplace_id, ParameterType.QueryString); // 修正后写法 IRestRequest restRequest = new RestRequest(rdt_resource, Method.POST); // 将MarketplaceIds参数移入CreateRestrictedDataTokenRequest对应的参数属性中即可
- 修正body添加逻辑,取消提前序列化JSON
// 原错误写法:提前序列化后传给AddJsonBody会导致双重转义 // restRequest.AddJsonBody(Serialize(request)); // 修正后写法:直接传入对象,由AddJsonBody负责序列化 restRequest.AddJsonBody(request);
- 修正body哈希计算逻辑,确保编码为UTF-8无BOM
// 修正后的HashRequestBody方法 public virtual string HashRequestBody(IRestRequest request) { Parameter body = request.Parameters.FirstOrDefault(parameter => ParameterType.RequestBody.Equals(parameter.Type)); if (body == null || body.Value == null) { // 空body的固定SHA256哈希值 return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; } // 使用UTF-8无BOM编码获取body字节流计算哈希 byte[] bodyBytes = System.Text.Encoding.UTF8.GetBytes(body.Value.ToString()); return Utils.ToHex(Utils.Hash(bodyBytes)); }
- 确保
content-type请求头加入签名的signedHeaders列表中,参与签名计算。
- 确保
内容的提问来源于stack exchange,提问作者TomR
相关产品推荐
相关产品推荐

