在 POST 参数中使用数组时 SHA1 签名无效

SHA1 signature invalid when using an array in POST parameters

我正在使用交换 API 创建一个机器人。交换使用 SHA1 和私钥来签署 HTTP 请求。一切正常,除非我的 POST 参数之一是数组。

我尝试使用 JSON.stringify 和 querystring.stringify 而不是仅按原样使用数组。我什至尝试将参数作为字符串发送,但 API 响应说它必须是一个数组。


    let api_key = 'api_key';
    let secret = fs.readFileSync('./key.pem').toString('ascii');
    var params: any = {
      amount: '1',
      api_key,
      begin_time: '',
      end_time: '',
      market: 'USDT',
      market_type: '1',
      page: '1',
      price: '150',
      size: '10',
      token: 'LTC',
      tokens: 'LTC', //this must be an array, but when I make it an array the signature becomes invalid
      type: '2',
    };
    const hash = crypto.createSign('sha1');
    hash.update(JSON.stringify(params));
    const signature = encodeURIComponent(hash.sign(secret, 'base64'));

    params = {
      sign: signature,
      ...params,
    };

    console.log(params);
    var api_endpoint = '/api_market/getBalance';
    var url = 'https://api.bcex.vip' + api_endpoint;
    var http_header = {
      'Content-Type': 'application/x-www-form-urlencoded',
    };

    request.post(
      url,
      {
        headers: http_header,
        body: querystring.stringify(params),
      },
      function(error, response, body) {
        if (error) {
          // res.json(error);
          console.error(error);
        } else {
          // res.json(body);
          // console.log(response);
          console.log(JSON.parse(body));
        }
      },
    );
  }

API 维基: https://github.com/BCEX-TECHNOLOGY-LIMITED/API_Docs/wiki/Interface

签名说明 https://github.com/BCEX-TECHNOLOGY-LIMITED/API_Docs/wiki/Sign

端点getBalance需要token为数组

原来是querystring库的问题,我改成了qs,现在可以了