首页 > 解决方案 > Google Apps 脚本:连接到 Amazon Selling Partner API(访问令牌)

问题描述

我正在尝试使用 Google Apps 脚本连接到Amazon Selling Partner API 。

如果我们目前没有有效的访问令牌(访问令牌在生成后一小时到期),则基于文档的第一步是生成访问令牌。

为此,我们需要以下输入:

我正在尝试为需要卖家授权的操作生成访问令牌

到目前为止,这是我的代码:

const REFRESH_TOKEN = "MyRefreshToken";
const CLIENT_ID ="MyClientID";
const CLIENT_SECRET = "MyClientSecret"

function AccessToken(){
  var base_url = 'https://api.amazon.com/auth/o2/token';
  var pointParams = "?grant_type=refresh_token&refresh_token=" + REFRESH_TOKEN + "&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET;
  var query_string = base_url + pointParams;

  var headers = {
    'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
    //'Host': 'api.amazon.com' (ignored since we already provided the url in the base_url var)
  }
  var options = {
    'method' : 'POST',
    'headers': headers,
    //'muteHttpExceptions': true

  };

  var rawData = UrlFetchApp.fetch(query_string, options).getContentText();
  Logger.log('rawData: ' + rawData)
}

注意:当我们调用需要卖家授权的操作时,我们将设置参数grant_type = refresh_token,在这种情况下scope不应包含参数

这是网站提供的示例代码:

POST /auth/o2/token HTTP/l.l
Host: api.amazon.com
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
grant_type=refresh_token
&refresh_token=Aztr|...
&client_id=foodev
&client_secret=Y76SDl2F

问题

我收到 500 服务器错误:

异常: https ://api.amazon.com的请求失败,返回代码 500。截断的服务器响应:{}(使用 muteHttpExceptions 选项检查完整响应)AccessToken @ API.gs:30

使用'muteHttpExceptions': trueonly 表明 UrlFetchapp 的结果为空

问题

根据文档,500 错误被描述为

出现内部服务故障。

但是,我想问一下我的代码中是否有一些我可以改进的部分,或者我可以检查的其他内容,因为响应没有给我任何线索。

更新#1

以下是 const 变量的格式:

在亚马逊提供的示例代码中,他们对此地址进行了 POST:

POST /auth/o2/token HTTP/l.l

但是我不包括 HTTP/l.l在我的base_url. 我不确定这是否会在这个问题中发挥作用。

更新#2

按照此示例,我可以在我的 cmd 终端(Windows 用户)上使用以下 curl 命令生成访问令牌:

curl -k -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=refresh_token&refresh_token=Atzr|IwE....&client_id=amzn1.application-oa2-client.d67...&client_secret=317dcd..." https://api.amazon.com/auth/O2/token

我得到的回应是:

{"access_token":"Atza|IwEB...","token_type":"bearer","expires_in":3600}

正如 Tanaike 指出的那样,Google Apps 脚本很可能无法向端点请求。

标签: amazon-web-servicesapigoogle-apps-script

解决方案


修改点:

  • 默认内容类型UrlFetchApp.fetchapplication/x-www-form-urlencoded. 并且,使用了 UTF-8。
  • 我不确定特殊字符是否包含在REFRESH_TOKEN,CLIENT_IDCLIENT_SECRET. 那么,如何反映 URL 编码呢?

当以上几点反映到您的脚本时,它变成如下。

修改后的脚本:

var base_url = 'https://api.amazon.com/auth/o2/token';
var pointParams = "?grant_type=refresh_token&refresh_token=" + encodeURIComponent(REFRESH_TOKEN) + "&client_id=" + encodeURIComponent(CLIENT_ID) + "&client_secret=" + encodeURIComponent(CLIENT_SECRET);
var query_string = base_url + pointParams;
var options = {
  'method' : 'POST',
  //'muteHttpExceptions': true
};

笔记:

  • 请再次确认您的REFRESH_TOKEN,CLIENT_ID和的值是否CLIENT_SECRET为有效值。
  • 顺便说一句,你的问题说For that we would need the following inputs:grant_type (parameter) refresh_token (input) scope (parameter) client_id (input) client_secret (input)。但是,您的脚本似乎不包含scope.

添加:

根据您更新的问题,当您的以下 curl 命令正常工作时,

curl -k -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=refresh_token&refresh_token=Atzr|IwE....&client_id=amzn1.application-oa2-client.d67...&client_secret=317dcd..." https://api.amazon.com/auth/O2/token

需要修改 Google Apps 脚本。因为您的 curl 命令将数据作为表单数据发送。那么您能否测试以下示例脚本?

示例脚本:

请设置变量并进行测试。

var base_url = 'https://api.amazon.com/auth/O2/token';
var options = {
  method: "post",
  payload: {
    grant_type: "refresh_token",
    refresh_token: REFRESH_TOKEN,
    client_id: CLIENT_ID,
    client_secret: CLIENT_SECRET
  },
  // muteHttpExceptions: true
};
var rawData = UrlFetchApp.fetch(base_url, options).getContentText();
Logger.log(rawData)

推荐阅读