Amazon MWSに接続するために以下のコードを書きました。
MWSとは決められたリクエストを行うと、Amazonの商品データなど欲しいデータを返してくれるものです。
MWSでは、リクエストの際、署名対象の文字列に対してhmacで暗号化をしたものをリクエストする必要があります。
また、「自分のしたいリクエストを行う場合、署名対象の文字列と暗号化後の文字列はこうなりますよ」というのを教えてくれるツールが提供されています。
(ツールはこちらです)https://mws.amazonservices.jp/scratchpad/index.html
そこでhmacの計算が正しく行われているかを確認するために以下のコードを書いたのですが、
そのツールでの計算と一致しません。
========
Python
1import hmac 2import hashlib 3import base64 4 5secret_key = b"取得した秘密キー" 6 7canonical = b""" 8POST 9… 「署名対象の文字列」をここにコピペ … 10""" 11 12h = hmac.new(secret_key, canonical.strip(), hashlib.sha256) 13 14print(h.hexdigest()) 15print(base64.b64encode(h.digest())) 16
========
※取得した秘密キーと署名対象の文字列にはそれぞれ本当のキーを入れています
どなたか何か可能性でも良いのでご指摘いただけますと幸いです。
よろしくお願い致します。
(参照元ブログ)https://tech.torico-corp.com/blog/amazon-marketplace-mws-api/
【2018/01/09追記】
署名対象の文字列を実行する部分のコードも合わせて転記させていただきます。
(実行しているコード全文です)
Python
1import base64 2import datetime 3import hashlib 4import hmac 5from urllib import quote 6 7import requests 8 9AMAZON_CREDENTIAL = { 10 'SELLER_ID': 'セラーID', 11 'ACCESS_KEY_ID': 'AWSアクセスキーID', 12 'ACCESS_SECRET': 'アクセスシークレット', 13} 14 15DOMAIN = 'mws.amazonservices.jp' 16ENDPOINT = '/Orders/2013-09-01' 17 18 19def datetime_encode(dt): 20 return dt.strftime('%Y-%m-%dT%H:%M:%SZ') 21 22timestamp = datetime_encode(datetime.datetime.utcnow()) 23 24last_update_after = datetime_encode( 25 datetime.datetime.utcnow() - datetime.timedelta(days=1)) 26 27data = { 28 'AWSAccessKeyId': AMAZON_CREDENTIAL['ACCESS_KEY_ID'], 29 'Action': 'ListOrders', 30 'MarketplaceId.Id.1': 'A1VC38T7YXB528', 31 'SellerId': AMAZON_CREDENTIAL['SELLER_ID'], 32 'SignatureMethod': 'HmacSHA256', 33 'SignatureVersion': '2', 34 'Timestamp': timestamp, 35 'Version': '2013-09-01', 36 'LastUpdatedAfter': last_update_after, 37} 38 39query_string = '&'.join('{}={}'.format( 40 n, quote(v, safe='%')) for n, v in sorted(data.items())) 41 42canonical = "{}\n{}\n{}\n{}".format( 43 'POST', DOMAIN, ENDPOINT, query_string 44) 45 46h = hmac.new( 47 bytes(AMAZON_CREDENTIAL['ACCESS_SECRET']), 48 bytes(canonical), hashlib.sha256) 49 50signature = quote(base64.b64encode(h.digest()), safe='') 51 52url = 'https://{}{}?{}&Signature={}'.format( 53 DOMAIN, ENDPOINT, query_string, signature) 54 55response = requests.post(url) 56 57print(response.content.decode())
回答1件
あなたの回答
tips
プレビュー