SubmitFeed APIでSignitureが合わないエラーが出る
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に詳しい方ご教授いただけると非常に助かります。
よろしくお願いします。
SubmitFeed APIでSignitureが合わないエラーが出る
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に詳しい方ご教授いただけると非常に助かります。
よろしくお願いします。
14件の返信
Seller_d8ocSw9LORnIX
Secret Access Key の問題と書いてあるので再生成してみれば良いのでは。
以前“ / “ が入っているとエンコードのエラーが出たことがあったけど、今はそういう問題はないと思う。
Seller_UUOv80JnzJZ7O
現状未だに問題が解決しておりません。
どの部分が正しくないかわかる方いらっしゃいますでしょうか?
同じシークレットキーを使って商品APIを実行できるかどうかを再度確認しましたが、やはりこちらは問題なくデータの取得ができています。
『問題点の可能性』
・コードで生成したContent-MD5が正しくない
・XMLデータの送信方法が正しくない
・シークレットキーが正しくない
私としては、スクラッチパッドのContent-MD5とコード生成したMD5が一致していることと、商品APIでデータが取得出来ることからデータの送信方法が正しくないのかなと考察しております。
どなたかアドバイスをいただければ助かります。
よろしくお願いします。