使用Google Apps Script调用Xero API时遇403错误的解决咨询
解决Xero API调用403错误的方案
以下是针对你遇到的403错误的具体排查和修复步骤:
1. 补充xero-tenant-id请求头
Xero的会计类API(如Journals接口)必须携带xero-tenant-id请求头,你的callXeroApi函数里遗漏了这个关键参数。修改后的请求头配置如下:
headers: { 'Authorization': 'Bearer ' + service.getAccessToken(), 'Accept': 'application/json', 'xero-tenant-id': XERO_TENANT_ID // 新增该行 }
2. 验证权限范围与应用配置一致性
- 确认代码中设置的
scope包含accounting.journals.read(你的代码已经配置正确) - 登录Xero开发者后台,检查你的应用是否启用了对应的权限,确保权限范围和代码中的完全匹配
3. 重置OAuth授权状态
如果旧的授权令牌存在权限问题,可清除现有授权信息并重新认证:
- 在脚本编辑器中执行以下代码清除存储的令牌:
function resetAuth() { PropertiesService.getUserProperties().deleteAllProperties(); }
- 重新运行
logAuthorizationUrl()获取授权链接,完成OAuth2认证流程
4. 核对回调URL配置
确保Xero开发者后台中设置的回调URL,与代码里OAUTH2_CALLBACK的内容完全一致(包括域名、路径和大小写)
5. 检查令牌有效性
在代码中添加日志,确认令牌是否有效且未过期:
function checkTokenStatus() { var service = getXeroService(); if (service.hasAccess()) { Logger.log('Access Token: ' + service.getAccessToken()); Logger.log('Token Expires At: ' + service.getTokenExpirationDate()); } }
修改后的完整callXeroApi函数
function callXeroApi() { var service = getXeroService(); if (service.hasAccess()) { var url = "https://api.xero.com/api.xro/2.0/Journals"; var options = { method: 'GET', headers: { 'Authorization': 'Bearer ' + service.getAccessToken(), 'Accept': 'application/json', 'xero-tenant-id': XERO_TENANT_ID // 补充租户ID头 }, muteHttpExceptions: true }; var response = UrlFetchApp.fetch(url, options); if (response.getResponseCode() == 200) { var json = JSON.parse(response.getContentText()); Logger.log(json); } else { // 打印详细错误信息便于排查 Logger.log('Error Code: ' + response.getResponseCode()); Logger.log('Error Response: ' + response.getContentText()); } } else { Logger.log('No access token available.'); } }
内容的提问来源于stack exchange,提问作者MarcFRed Tch
相关产品推荐
相关产品推荐

