You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中用https模块调用Intuit OAuth2刷新Token失败求助

解决Intuit OAuth2刷新令牌生成Access Token的400错误问题

你的https模块代码存在几个关键问题导致400无效请求,以下是修正后的代码及问题说明:

修正后的代码

async function quickbookTokenHttps() {
  const https = require('https');
  const querystring = require('querystring'); // 用于编码表单数据

  const headers = {
    Authorization: 'Basic <Authorization code found on https://developer.intuit.com/app/developer/playground>',
    Accept: 'application/json',
    'Content-Type': 'application/x-www-form-urlencoded',
  };

  const bodyObj = {
    grant_type: 'refresh_token',
    refresh_token: '<Refresh token found on https://developer.intuit.com/app/developer/playground>',
  };

  // 将对象编码为x-www-form-urlencoded格式的字符串
  const body = querystring.stringify(bodyObj);
  // 补充Content-Length请求头
  headers['Content-Length'] = Buffer.byteLength(body);

  const options = {
    hostname: 'oauth.platform.intuit.com',
    path: '/oauth2/v1/tokens/bearer',
    method: 'POST',
    headers: headers,
  };

  // 封装https.request为Promise,适配async/await语法
  return new Promise((resolve, reject) => {
    const req = https.request(options, (res) => {
      let result = '';
      console.log(res.statusCode);
      console.log(res.statusMessage);

      res.on('data', (chunk) => {
        result += chunk;
      });

      res.on('end', () => {
        try {
          const parsedResult = JSON.parse(result);
          console.log(parsedResult);
          resolve(parsedResult);
        } catch (err) {
          reject(err);
        }
      });
    });

    req.on('error', (err) => {
      console.log(err);
      reject(err);
    });

    // 将编码后的请求体写入请求
    req.write(body);
    req.end();
  });
}

关键问题说明

  • 表单数据未编码:axios会自动将data对象按照application/x-www-form-urlencoded格式编码,但https模块无此自动处理能力,必须用querystring.stringify()将对象转换为key=value&key2=value2的字符串格式,否则服务器无法解析请求体。
  • 错误的options参数:https模块的options中不存在data或body属性,不能直接将请求体放在options内,必须通过req.write()方法写入请求。
  • 缺少Content-Length头:发送带请求体的POST请求时,需在headers中指定Content-Length,对应编码后字符串的字节长度,服务器依赖该头读取完整请求体。
  • https.request非Promise类型:原代码直接用await修饰https.request()无效,因为它不返回Promise,需手动封装为Promise才能适配async/await语法。

内容的提问来源于stack exchange,提问作者kevin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:05:19