SubmitFeed APIでSignitureが合わないエラーが出る


(53aab794f77d7828d861) #1

Google Apps ScriptにてSubmitFeed APIを利用して価格の変更はを試みているのですが、次のようなエラーメッセージが出てフィードの送信が完了できません。

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.

他のAPIで使用した際にはSignitureは同じやり方で生成しても問題ありませんでした。

スクラッチパッドで必要情報を入れた場合はエラーなくデータが送信され、価格も変更していることが確認できています。

具体的なコードは下記になります。

function makeUrl_SubmitFeed(object) {
  var properties = PropertiesService.getScriptProperties();
  var __AWSAccessKeyId__ = properties.getProperty("awsAccessKeyId");
  var __SellerID__ = properties.getProperty("sellerId");
  var __AWSSecretKey__ = properties.getProperty("awsSecretKey");
  var mySku = "abcde-12345";
  var feed = '<?xml version="1.0" encoding="utf-8"?>' +
             '<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">' +
             '<Header><DocumentVersion>1.01</DocumentVersion>' +
             '<MerchantIdentifier>' + __SellerID__ + '</MerchantIdentifier>' +
             '</Header>' +
             '<MessageType>Price</MessageType>' +
             '<Message><MessageID>1</MessageID>' +
             '<Price>' +
             '<SKU>' + mySku + '</SKU>' +
             '<StandardPrice currency="JPY">9000</StandardPrice>' +
             '</Price>' +
             '</Message>' +
             '</AmazonEnvelope>';
  var fileName = "updateFile.xml"
  var file = folder.createFile(fileName, feed, "application/xml");
  var blob = file.getBlob();
  var md5 = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, feed));
  var __baseurl__ = "https://mws.amazonservices.jp";
  var api = "/Feeds/";
  var version = "2009-01-01";
  var action = "SubmitFeed";
  var feedType = "_POST_PRODUCT_PRICING_DATA_";
  var method = "POST";
  
  //create params
  var params = {};
  params["AWSAccessKeyId"] = __AWSAccessKeyId__;
  params["Merchant"] = __SellerID__;
  params["SignatureVersion"] = "2";
  params["SignatureMethod"] = "HmacSHA256";
  params["Action"] = action;
  params["FeedType"] = feedType;
  params["ContentMD5Value"] = md5;
  params["MarketplaceIdList.Id.1"] = "A1VC38T7YXB528";
  params["Timestamp"] = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
  params["Version"] = version;
  
  //create signature
  var parts = []
  parts.push(method);
  parts.push("mws.amazonservices.jp");
  parts.push("/");
  var data = []
  for(var key in params){
    var value = params[key];
    data.push(key + '=' + encodeURIComponent(value));
  }
  data.sort();
  parts.push(data.join("&"));
  var sign_data = parts.join("\n");
  var signature = Utilities.base64Encode(Utilities.computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8));
  data.push('Signature=' + encodeURIComponent(signature));
  data.sort();
  var url =  __baseurl__ + api + version + '?' + data.join("&");
  var header = {
    "Content-MD5": md5,
    "Content-Type": "text/xml",
  }
  var params = {
    headers: {
      header: header
    },
    method: "POST",
    payload : blob,
    muteHttpExceptions : true,
  }
  var response = UrlFetchApp.fetch(url, params);
  var data = response.getContentText();
  var responseCode = response.getResponseCode();
  Logger.log(data);
  Logger.log(responseCode); //returned 403
}

上記コードの各パラメータの値やmd5を確認してもスクラッチパッドの場合と同じ値がセットされています。
Timestampのみ実行時の時間となりますので、同じではありません。

確認した内容として、スクラッチパッドで送信するXMLから生成されたmd5の文字列と同じXMLから私のコードでmd5を生成した場合の値が正しいかどうかも確認しましたが、こちらもスクラッチパッドのmd5と値が同じでした。

この事から、送信先URLの生成自体には問題がないものと考えています。

コードではXMLファイルをblobデータとしてpayloadにセットして送信していますが、この部分が正しくなく、アマゾン側でのmd5が私のコードで生成したmd5と違うのではないか?と予想していますが、解決までには至っておりません。

MWS APIに詳しい方ご教授いただけると非常に助かります。

よろしくお願いします。


(DBO) #2

Secret Access Key の問題と書いてあるので再生成してみれば良いのでは。
以前“ / “ が入っているとエンコードのエラーが出たことがあったけど、今はそういう問題はないと思う。


(53aab794f77d7828d861) #3

同じシークレットキーを使用してフィード以外のAPIを実行すると現段階でも問題なく処理ができるのでシークレットキーに問題はないと判断しています。

スクラッチパッドでも同じ認証情報でフィードを送信してみましたがこちらも現状のシークレットキーで送信が出来ている状況です。


(DBO) #4

スクラッチパッドと本番環境の差は「認証」だけなので、やはりエラーメッセージの通りに認証情報に問題があると考えるべきでは?
そうでなければ、なんのためのエラーメッセージなのかと思いますが。


(53aab794f77d7828d861) #5

スクラッチパッドでも同じシークレットキー(及びその他認証情報)を入力して試しているのですが、スクラッチパッドでは入力内容に関わらず独自のシークレットキーが使用されているのですか?

スクラッチパッドの仕様に詳しくないので、そもそも見当違いのことを言っていたら申し訳ない。


(DBO) #6

スクラッチパッドでfeedの送信結果でcontent-md5は確認しているんですよね?


(53aab794f77d7828d861) #7

はい、本番環境でコードで生成したcontent-md5とスクラッチパッドに入力したフィード文字列から生成されたcontent-md5は一致していることを確認しています。

私のコードでpayloadとして送信しているxmlファイルからアマゾン側でcontent-md5が計算される際にデータの送信方法等の間違いか何かで実際にはアマゾン側で違うcontent-md5が生成されて、結果としてsignatureが一致しないのかなという仮設を立ててみました。

この仮設も正しくないかもしれませんが、その他のパラメータが同じため、これ以外今のところ思いついておりません。

ご返信いただきありがとうございます。
全く手がかりがない中でのご返信でしたのでとても心強く思います。
引き続きよろしくお願いします。


(DBO) #8

お役に立てず申し訳ない。
あとはスクラッチパッドの認証の詳細情報で表示される部分の差(環境の差)やUser agentの差ぐらいしか思いつかないです。


(DBO) #9

まさかそれはないと思いますが、送信する側のPCとサーバーのタイマーのズレとか?


(53aab794f77d7828d861) #10

念の為開発環境のタイムゾーン設定を確認しました。
Google Apps Scriptなのでクラウド環境での開発となり、送信する側のPCはGoogleのサーバマシンとなります。
設定はAsia/Tokyoとなっているので設定自体は問題ないとは思うのですが、Amazon側の設定はどうなっているかはよくわかりませんね。

Amazonのリクエストパラメータの必須項目として、『FeedContent』というキーでXMLを送信となっているので、Payloadで送るべきではないということでしょうか??

今まではフィードAPIをあまり使ったことがなく、主に情報を取得する目的で商品API等を使用していましたので、わからないことが多くあります。。。

ご返信感謝いたします。


(53aab794f77d7828d861) #11

現状未だに問題が解決しておりません。
どの部分が正しくないかわかる方いらっしゃいますでしょうか?

同じシークレットキーを使って商品APIを実行できるかどうかを再度確認しましたが、やはりこちらは問題なくデータの取得ができています。

『問題点の可能性』
・コードで生成したContent-MD5が正しくない
・XMLデータの送信方法が正しくない
・シークレットキーが正しくない

私としては、スクラッチパッドのContent-MD5とコード生成したMD5が一致していることと、商品APIでデータが取得出来ることからデータの送信方法が正しくないのかなと考察しております。

どなたかアドバイスをいただければ助かります。

よろしくお願いします。


(A→Z(本人確書類?/公共料本人名義/小売店レシートNG/クレカ半角)) #12

お困りのようなので素人ですがレスします

TS担当部署へ問い合わせ済みでしょうか?

具体的なコードも添付して
担当部署より回答ください、ではいかがでしょうか?

既に行っているかと思いますが、API関連はダメなのかもしれませんが
担当部署から、(別件DL/ULですが)電話くれることもありました

GW中やコロナ減員で日数かかるかもしれませんが
問合せしていないなら行ってみてください

0120-999-373で担当部署へ電話転送か?都合の良い時間帯に電話くださいなら
20時以降にかかってきたことあります

詳しくないので、これがama関連なら回答もらえるのかもしれませんが


(DBO) #13

ここに認証情報を書くことができないのでそこにエラーは自分で潰すしかないのでは?
payloadで送るべきではないとまで書かれていたので試しているものと思ってました。


(53aab794f77d7828d861) #14

ご回答ありがとうございます。
ありがとうございます。

こちらも含めて確認してみますね。
返信ありがとうございます。


(53aab794f77d7828d861) #15

色々と試してはいるのですが、決定的な部分までたどり着けていません。

payload: {
  FeedContent: blob
}


FeedContent: feed
など考えられるものは試しているのですが未だに解決に至らないので、わらにもすがる思いです。

確かに認証情報を書くことができないのでご回答も限定的なものになってしまいますよね。
もう少し試行錯誤してみます。


(system) closed #16

このトピックは最後の返信から180日が経過したので自動的にクローズされました。新たに返信することはできません。