python - 亚马逊 MWS 错误签名不匹配 (Python)

标签 python amazon-mws

目前,我在尝试向 Amazon Marketplace WebService 提交请求时遇到以下错误:

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. 62baed22-cc14-49bd-bf34-c1eb10bc4019

代码:

import sys, os, base64, datetime, hashlib, hmac, urllib
from time import gmtime, strftime
from requests import request
import urllib.parse
import urllib.request
import dateutil.parser

def get_timestamp():
    time = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime())
    return dateutil.parser.parse(time)

def calc_signature(method, domain, URI, request_description, key):
    sig_data = method + '\n' + \
        domain.lower() + '\n' + \
        URI + '\n' + \
        request_description

    hmac_obj = hmac.new(key.encode(), sig_data.encode(), hashlib.sha256)
    digest = hmac_obj.digest()

    return urllib.parse.quote(base64.b64encode(digest), safe='-_+=/.~')

SECRET_KEY = 'XXXXXXXX'
AWS_ACCESS_KEY = 'XXXXXXXX'
SELLER_ID = 'XXXXXXXX'
MARKETPLACE_ID = 'XXXXXXXX'
MWS_AUTH_TOKEN = 'XXXXXXXXXXX'

Action = 'GetLowestPricedOffersForASIN'
SignatureMethod = 'HmacSHA256'
SignatureVersion = '2'
Timestamp = get_timestamp()
Version = '2011-10-01'
CreatedAfter = '2011-10-01T23:00:57Z'
URI = '/Products/2011-10-01'
domain = 'mws.amazonservices.com'
proto = 'https://'
method = 'POST'
ASIN = 'B004KZQVF4'
itemcondition = 'New'

payload = {
    'AWSAccessKeyId': AWS_ACCESS_KEY,
    'Action': Action,
    'SellerId': SELLER_ID,
    'MWSAuthToken': MWS_AUTH_TOKEN,
    'SignatureVersion': SignatureVersion,
    'Timestamp': '2016-01-08T05%3A32%3A48Z',
    'Version': Version,
    'SignatureMethod': SignatureMethod,
    'CreatedAfter': CreatedAfter,
    'MarketplaceId.Id.1': MARKETPLACE_ID,
    'ASIN': ASIN,
    'ItemCondition': itemcondition
}

request_description = '&'.join(['%s=%s' % (k, urllib.parse.quote(payload[k], safe='-_+=/.~').encode('utf-8')) for k in sorted(payload)])

sig = calc_signature(method, domain, URI, request_description, SECRET_KEY)

url = '%s%s?%s&Signature=%s' % \
    (proto+domain, URI, request_description, urllib.parse.quote(sig))

headers = {
    'Host': domain,
    'Content-Type': 'text/xml',
    'x-amazon-user-agent': 'python-requests/1.2.0 (Language=Python)'
}

response = request(method, url, headers=headers)

URL输出:

https://mws.amazonservices.com/Products/2011-10-01?ASIN=XXXXXXX&AWSAccessKeyId=XXXXXXX&Action=GetLowestPricedOffersForASIN&CreatedAfter=2014-08-26T23%3A00%3A57Z&ItemCondition=New&MWSAuthToken=XXXXXXX&MarketplaceId.Id.1=XXXXXXX&SellerId=XXXXXXX&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2016-01-13T21%3A08%3A57Z&Version=2013-09-01&Signature=hwooJu0FeDs3j26mEUN8of5buSI/QsgY54kVCUsAirw%3D

显然签名的生成方式有问题,但我无法缩小确切的原因。

最佳答案

嗯,我明白了。只需将方法从“POST”更改为“GET”即可。

我已经为此奋斗了好几天——我想事情就这么简单!

关于python - 亚马逊 MWS 错误签名不匹配 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34777296/

相关文章:

python - 带有图例的 matplotlib 散点图

python - 具有同一字符的多个实例的子字符串

python - Python 教程中 do_global() 的作用

python - 当 Reader 类型作为输入时,gzip.NewReader() 返回 nil

javascript - 收到 _POST_ORDER_FULFILLMENT_DATA_ 的签名错误

python - 如何在 Python 中的这个嵌套字典中搜索特定键?

python - pytorch 是否注册分配给对象属性的模块?

php - 如何将 Amazon MWS 响应中的 UTF-8 转义字符串转换为正确的 UTF-8?

amazon-mws - 是否可以使用 Amazon Marketplace 网络服务获取商家价格?

xml - 亚马逊 MWS 无法更新最低/最高价格