amazon-web-services - Google Apps 脚本:连接到 Amazon Selling Partner API(访问令牌)
问题描述
我正在尝试使用 Google Apps 脚本连接到Amazon Selling Partner API 。
如果我们目前没有有效的访问令牌(访问令牌在生成后一小时到期),则基于文档的第一步是生成访问令牌。
为此,我们需要以下输入:
- 授予类型(参数)
- 刷新令牌(输入)
- 范围(参数)
- client_id (输入)
- client_secret(输入)
我正在尝试为需要卖家授权的操作生成访问令牌
到目前为止,这是我的代码:
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': true
only 表明 UrlFetchapp 的结果为空
问题
根据文档,500 错误被描述为
出现内部服务故障。
但是,我想问一下我的代码中是否有一些我可以改进的部分,或者我可以检查的其他内容,因为响应没有给我任何线索。
更新#1
以下是 const 变量的格式:
- REFRESH_TOKEN:Atzr|[a-zA-Z0-9-]*
- CLIENT_ID:amzn1.application-oa2-client.[a-z0-9]{32}
- CLIENT_SECRET:[a-z0-9]{64}
在亚马逊提供的示例代码中,他们对此地址进行了 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 脚本很可能无法向端点请求。
解决方案
修改点:
- 默认内容类型
UrlFetchApp.fetch
是application/x-www-form-urlencoded
. 并且,使用了 UTF-8。 - 我不确定特殊字符是否包含在
REFRESH_TOKEN
,CLIENT_ID
和CLIENT_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)
推荐阅读
- python - 退出定义中的循环
- c - 出现错误:取消引用指向不完整类型“结构类型”的指针
- javascript - 在 asp.net core 中加载页面时如何显示已处理文件的数量?
- php - php / mariadb更新后禁止加载数据本地INFILE
- r - 当某些列表元素不可用时,在 R 中创建列表
- javascript - 这是使用 React-Filepond 的内存泄漏吗?
- javascript - 四舍五入到最接近的 0.5,而不是 0.0
- jquery - 如何在单击多个项目时使用 jQuery 循环遍历数组?
- php - laravel 根据表单中的多个字段创建一个带有查询的规则
- html - 网页无法缩放到视口宽度