构造UrlFetchApp请求获取ChinaBrands API访问令牌的技术问询
问题分析与修正方案
从你提供的代码来看,目前有两个核心问题会导致无法正确获取ChinaBrands的访问令牌,下面逐一拆解并给出修复方案:
1. 签名生成逻辑错误
你直接将data对象与SECRETKEY拼接,这会得到类似[object Object]xxxxxx的无效字符串,完全不符合API要求的签名规则。正确的处理步骤应该是:
- 先把
data对象序列化为无缩进的标准JSON字符串 - 将该字符串与
SECRETKEY拼接 - 再执行Base64编码操作(如果API要求先做哈希加密再编码,后续可根据文档调整,但先修正基础逻辑)
2. 请求Payload格式错误
因为你设置了contentType: "application/json",所以payload必须是JSON字符串,而非JavaScript对象——否则UrlFetchApp会自动将其编码为表单格式,导致API无法解析请求内容。
修正后的完整代码
function getAccessToken() { // 替换为你的实际配置参数 const EMAILID = "your_email@example.com"; const PWD = "your_login_password"; const APIKEY = "your_chinabrands_api_key"; const SECRETKEY = "your_chinabrands_secret_key"; const url = "https://gloapi.chinabrands.com/v2/user/login"; const data = { "email": EMAILID, "password": PWD, "client_id": APIKEY }; // 修正签名生成逻辑:先转JSON字符串再拼接密钥 const dataJsonStr = JSON.stringify(data); const signature = Utilities.base64Encode(dataJsonStr + SECRETKEY); // 构造请求体并转为JSON字符串 const payload = JSON.stringify({ "data": data, "signature": signature }); const options = { "method": "post", "contentType": "application/json", "payload": payload, // 开启后可捕获HTTP错误,便于调试 "muteHttpExceptions": true }; try { const response = UrlFetchApp.fetch(url, options); const jsonResponse = response.getContentText(); // 打印状态码辅助排查问题 console.log("响应状态码:", response.getResponseCode()); Browser.msgBox(jsonResponse); } catch (error) { Browser.msgBox("请求出错: " + error.toString()); } }
额外调试建议
- 开启
muteHttpExceptions: true后,即使遇到400、401这类HTTP错误,也能获取到API返回的错误详情,方便定位问题 - 如果签名仍然无效,建议仔细核对API文档中签名的具体算法(比如是否需要先对参数排序、是否需要做MD5/SHA哈希后再Base64编码)
内容的提问来源于stack exchange,提问作者Kishan Panchal
相关产品推荐
相关产品推荐

