带有Google Apps脚本的MWS SubmitFeed

问题描述 投票:0回答:1

我一直在尝试更新商品价格,但是在我的代码中似乎无法正常工作。响应说像这样:

我们计算出的请求签名与您提供的签名不匹配。检查您的AWS Secret Access密钥和签名方法。有关详细信息,请查阅服务文档。

对于其他操作,我的签名没有问题,但仅对于submitFeed操作,出现此错误。

这是我在code.gs中写的内容:

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
}

我已经使用Amazon MWS Scratchpad来检查输出是否有问题,但是我找不到任何东西。

有人可以告诉我我在想什么或做错了吗。

谢谢你。

google-apps-script amazon-mws
1个回答
0
投票

For other actions, my signature has no problems, but only for submitFeed operations, I got this error.,我认为您的脚本中可能需要修改md5哈希值。那么如何修改呢?

发件人:

var md5 = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, feed));

收件人:

var md5 = Utilities
  .computeDigest(Utilities.DigestAlgorithm.MD5, feed)
  .map(function(byte) {return ('0' + (byte & 0xFF).toString(16)).slice(-2)})
  .join('');

注意:

  • 在您的脚本中,Utilities.computeDigest()中的字节数组被转换为base64。在此修改中,字节数组转换为十六进制的字符串值。
  • 我无法测试此修改后的脚本。

参考:

添加:

此外,以下修改如何?在此修改中,将signature作为十六进制的字符串值而不是base64检索。

发件人:

var signature = Utilities.base64Encode(Utilities.computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8));

收件人:

var signature = Utilities
  .computeHmacSha256Signature(sign_data, __AWSSecretKey__, Utilities.Charset.UTF_8)
  .map(function(byte) {return ('0' + (byte & 0xFF).toString(16)).slice(-2)})
  .join('');
© www.soinside.com 2019 - 2024. All rights reserved.