簡體   English   中英

{error={name=HTTPError, message=Signature not valid.}} Bitmex Api 連接錯誤

[英]{error={name=HTTPError, message=Signature not valid.}} Bitmex Api connection error

我一直在盡我所能解釋bitmex 的 api 連接指示,但這就是我得到的:

function balanceBitmex() {

  var apiKey = '***';
  var apiSecret = '***';

  var verb = 'get';
  var path = '/api/v1/user/wallet';

  var expires = Number(new Date().getTime() +5).toFixed(0);
  var expires = expires.toString();


  var data = '';
  var data = JSON.stringify(data);
  var currency = '';
  var count= '';
  var concat = verb+path+expires+data;


  var apiSignature = Utilities.computeHmacSha256Signature(apiSecret, concat);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");


  var params = {
    'method': 'get',
    'headers': {'contentType': 'application/json',
                'api-expires': expires,
                'api-key': apiKey,
                'api-signature': apiSignature},
    'muteHttpExceptions': true
  };

  //var params = params + data;

  var url = "https://www.bitmex.com/api/v1/user/wallet?currency=XBt";

  var data = UrlFetchApp.fetch(url, params);
  var data = JSON.parse(data.getContentText());

我的腳本有什么問題? bitmex api explorer - 用戶錢包

函數Utilities.computeHmacSha256Signature(String, String)采用兩個參數,順序如下:

  1. value:要為其生成哈希的輸入值。
  2. key:用於生成哈希的密鑰。

在您的情況下,您實際上是使用concat作為密鑰來加密apiSecret 然而,它應該是相反的—— apiSecret應該是用於加密concat的密鑰。 您只需更改:

var apiSignature = Utilities.computeHmacSha256Signature(apiSecret, concat);

對於以下內容:

var apiSignature = Utilities.computeHmacSha256Signature(concat, apiSecret);

此外,您可以使用以下代碼計算BitMex 文檔中提供的示例並驗證其是否正常工作。

function testEncryption() {
  var apiSecret = 'chNOOS4KvNXR_Xq4k4c9qsfoKWvnDecLATCRlcBwyKDYnWgO';
  var verb = 'GET';
  var path = '/api/v1/instrument';
  var expires = 1518064236; 
  var data = '';

  var apiSignature = Utilities.computeHmacSha256Signature(verb + path + expires + data, apiSecret);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");

  Logger.log(apiSignature);
}

運行上述代碼的結果是c7682d435d0cfe87c16098df34ef2eb5a549d4c5a3c2b1f0f77b8af73423bf00 ,這與 BitMex 文檔中顯示的結果相同。

關於您提供的代碼,為了使 API 正常工作,還有一些錯誤需要解決:

  1. verb parameter :你指定的參數是get ,但是 API 只接受這個參數為大寫 ( GET )。 使用前者,簽名將不同,從而使請求失敗。
  2. path querystring :在計算簽名時必須存在查詢字符串(在您的請求currency=XBt的情況下),但在您的代碼中它不是(注意行var path = '/api/v1/user/wallet'; )

在修復上述所有錯誤並清除一些未使用的變量后,您的最終代碼可能如下所示:

function balanceBitmex() {
  var apiKey = '***'
  var apiSecret = '***';

  var verb = 'GET';

  var path = '/api/v1/user/wallet?currency=XBt';

  var expires = Math.floor((Date.now() / 1000) + 600).toFixed(0);

  var concat = verb + path + expires;

  var apiSignature = Utilities.computeHmacSha256Signature(concat, apiSecret);
  apiSignature = apiSignature.map(function(e) {
      var v = (e < 0 ? e + 256 : e).toString(16);
      return v.length == 1 ? "0" + v : v;
  }).join("");

  var params = {
    'headers': {
      'api-expires': expires,
      'api-key': apiKey,
      'api-signature': apiSignature
    },
    'muteHttpExceptions': true
  };

  var url = "https://www.bitmex.com/api/v1/user/wallet?currency=XBt";

  var response = UrlFetchApp.fetch(url, params);
  var data = JSON.parse(response.getContentText());

  Logger.log(data);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM